プロが教えるわが家の防犯対策術!

[注文表]
注文番号 注文商品 注文金額
=======================
111   あああ  5500
222   いいい  3000

[注文オプション表]
注文番号 オプション
================
111   P1
111   P2
222   D1

上記のようなテーブルがあります。
これを下記のようにSQLでまとめたいですが可能でしょうか。
もしありましたら、サンプルSQLをご教示いただけませんでしょうか。

[注文一覧]
注文番号 注文商品 注文金額 オプション1 オプション2
======================================================
111    あああ  5500   P1      P2
222    いいい  3000   D1

お手数をお掛けしますが、なにとぞよろしくお願いいたします。

A 回答 (5件)

こんな感じではどうでしょうか?



select
注文番号,注文商品,注文金額
,max(case when recnum = 1 then オプション else null end) オプション1
,max(case when recnum = 2 then オプション else null end) オプション2
,max(case when recnum = 3 then オプション else null end) オプション3
--以下、必要なだけ・・
from
(select
注文表.注文番号,注文表.注文商品,注文表.注文金額,注文オプション表.オプション
,row_number() over(partition by 注文表.注文番号 order by 注文オプション表.オプション) recnum
from 注文表
inner join 注文オプション表 on(注文表.注文番号 = 注文オプション表.注文番号))
group by 注文番号,注文商品,注文金額;

列名は動的に設定したい、とかでしたら普通のSQLだけでは難しいと思います。
    • good
    • 0

横展開する個数が決まっているなら、以下のようなSQLで横に展開できます。




select 注文番号,max(decode(R,1,オプション)) オプション1,max(decode(R,2,オプション)) オプション2
from
(
select 注文番号,オプション,row_number() over(partition by 注文番号 order by オプション) R
from 注文オプション表
)
group by 注文番号
;
    • good
    • 1

素直に別プログラムでやられたほうがいいと思います。


後々のメンテナンスでさわれないSQLになってしまいますよ。
    • good
    • 3

肝は「注文オプション表」ですよね。


「注文オプション表」を「tb1」で読み替えて
以下SQLを見てください。

uff-n さんが期待する
結果にはさらに副問い合わせを使って注文表と
結合する必要がありますが、まぁなんとか1SQLで書けると
思います。
同一注文番号のデータがあまりにも多い場合は以下SQLは少し苦しいですね。
あと、Oracleに限定したSQLであることも少し不満が残りますが参考にどうぞ。

---検証データ作成----
create table tb1(c1 number,c2 varchar2(10));
insert all
into tb1 (c1,c2) values(111,'aa3')
into tb1 (c1,c2) values(111,'aa2')
into tb1 (c1,c2) values(222,'aa1')
into tb1 (c1,c2) values(333,'aa1')
into tb1 (c1,c2) values(333,'aa2')
into tb1 (c1,c2) values(333,'aa3')
into tb1 (c1,c2) values(444,'aa5')
into tb1 (c1,c2) values(444,'aa5')
select * from dual
;

---縦を横に展開するSQL
select c1,max(c2_1) n01,max(c2_2) n02,max(c2_3) n03,max(c2_4) n04
from
(
select t.c1,
decode(rk,1,c2,null) c2_1,
decode(rk,2,c2,null) c2_2,
decode(rk,3,c2,null) c2_3,
decode(rk,4,c2,null) c2_4
from
(
select c1,c2,row_number() over(partition by c1 order by c2 ) rk from tb1
)t
) group by c1


--結果
C1  N01 N02 N03 N04
---  --- --- --- ---
111  aa2 aa3  
222  aa1    
333  aa1 aa2 aa3
444  aa5 aa5  



どうでしょうか?期待した結果でしたか?
    • good
    • 3

先ほど回答を入れたbaunceです。



申し訳ないです。すでに私と同じような内容で既にみなさん
が回答されていました。
むだな投稿してしまいました。
すみません。
    • good
    • 1
この回答へのお礼

御回答ありがとうございました。
お礼遅くなりまして、失礼しました。

お礼日時:2011/04/19 15:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す