• ベストアンサー

SQLの作成の仕方

SQLを学びだしたばかりの初心者です。 皆様のお知恵を貸して下さい。 商品 サイズ 金額 AAA S     100 AAA M     200 BBB S     300 CCC M     200 ↑このように登録されたDBがあるとします。 これから下記のような表を作りたいのですが 上手くSQLが書けません。 (追加)            商品 サイズ 金額 最小サイズ AAA S     100    S AAA M     200    S BBB S     300    S CCC M     200    M MIN関数とGROUP BYを使ってやればいいと思うのですが・・。 どうか宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

最近のオラクルなら、オラクルらしく分析関数で書くと スマートに書けるような気がします。 select 商品,サイズ,金額, min(decode(サイズ,'S',0,'M',1,'L',2)) over(partition by 商品 rows between unbounded preceding and unbounded following) as 最小サイズ from テーブル 古いオラクルや他のRDBの場合は、他の方が書かれているように自己結合と なりますけどね。 select a.商品,a.サイズ,a.金額,b.最小サイズ from テーブル a, (select 商品,min(decode(サイズ,'S',0,'M',1,'L',2)) 最小サイズ from テーブル group by 商品) b where a.商品=b.商品 相応の件数がある場合は、テーブルの探査量の問題で、分析関数の方が速いと思います。

その他の回答 (2)

回答No.2

group byが抜けていたので訂正。動くかは未確認です。 select tbl1.商品, tbl1.サイズ, tbl1.金額, (select tbl3.最小サイズ from (select subtbl1.商品, min(decode(subtbl1.サイズ, 'S', 1, 'M', 2, 'L', 3)) as 最小サイズ from tbl1 subtbl1 where tbl1.商品 = subtbl1.商品 group by subtbl1.商品) subtbl12, (select subtbl2.商品, decode(subtbl2.サイズ, 'S', 1, 'M', 2, 'L', 3) as サイズ区分, subtbl2.最小サイズ from tbl1 subtbl2 where tbl1.商品 = subtbl2.商品) subtbl22 where subtbl12.商品 = subtbl22.商品 and subtbl12.最小サイズ = subtbl22.サイズ区分 ) as 最小サイズ from tbl1

回答No.1

select tbl1.商品, tbl1.サイズ, tbl1.金額, (select tbl3.最小サイズ from (select subtbl1.商品, min(decode(subtbl1.サイズ, 'S', 1, 'M', 2, 'L', 3)) as 最小サイズ from tbl1 subtbl1 where tbl1.商品 = subtbl1.商品) subtbl12, (select subtbl2.商品, decode(subtbl2.サイズ, 'S', 1, 'M', 2, 'L', 3) as サイズ区分, subtbl2.最小サイズ from tbl1 subtbl2 where tbl1.商品 = subtbl2.商品) subtbl22 where subtbl12.商品 = subtbl22.商品 and subtbl12.最小サイズ = subtbl22.サイズ区分 ) as 最小サイズ from tbl1 こんなかなーーー・・・。試す環境が無いので確認とれてません。 文字をMIN()すると、MよりSの方が文字コードの関係で でかくなってしまいますよ多分。