- ベストアンサー
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を使ってやればいいと思うのですが・・。 どうか宜しくお願いします。
- みんなの回答 (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)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
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
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
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の方が文字コードの関係で でかくなってしまいますよ多分。