- 締切済み
複数条件に当てはまる行の抽出をするSQL文の書き方
SQL文の書き方について教えてください。 商品 横 縦 A 1 3 A 1 4 A 2 5 A 3 5 B 1 3 B 1 4 B 1 5 上記表から、商品毎に、縦が最大(第1優先)で、横が最小の行をとってくるというSQLを書いて、以下のように取り出されるようにしたいと考えています。 商品 横 縦 A 2 5 B 1 5 SQL初心者でうまく書けませんでした。 どうかご指導お願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- melanie_jp
- ベストアンサー率50% (1/2)
ANo.6に結合条件が抜けていましたので補足します。 select b.商品, min(a.横), b.縦 from table a, (select 商品, max(縦) 縦 from table group by 商品) b where a.商品 = b.商品 and a.縦 = b.縦 group by b.商品, b.縦 これならうまくいくはずです。
- melanie_jp
- ベストアンサー率50% (1/2)
select b.商品, min(a.横), b.縦 from table a, (select 商品, max(縦) 縦 from table group by 商品) b group by b.商品, b.縦 こんな感じならいかがでしょうか?
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
分析関数の使えるオラクルをお使いなら・・ select 商品,横,縦 from ( select x.*,row_numnber() over(partition by 商品 order by 縦 desc,横) R from hoge x ) where R=1 で良いかと思います。 分析関数が使えないのであれば、 select distinct * from hoge x where not exists ( select 1 from hoge y where x.商品=y.商品 and (x.縦>y.縦 or (x.縦=y.縦 and x.横<y.横)) ) な感じで良いかと思います。(未検証ですが)
- chukenkenkou
- ベストアンサー率43% (833/1926)
【方法1】 select 商品,min(横) as 横,縦 from tbl1 where (商品,縦) in(select 商品,max(縦) from tbl1 group by 商品) group by 商品,縦; 【方法2】 select 商品,min(横) as 横,min(縦) as 縦 from tbl1 where (商品,縦) in(select 商品,max(縦) from tbl1 group by 商品) group by 商品; ※min(縦)はmax(縦)でも結果は同じです。
- naochancom
- ベストアンサー率61% (41/67)
こんな感じでしょうか? select a.商品,min(b.横),a.max縦 from (select 商品,max(縦) as max縦 from test group by 商品) a inner join test b on (a.商品=b.商品 and a.max縦=b.縦) group by a.商品,a.max縦 これでいけると思うのですが、どうでしょうか?
- dober-o
- ベストアンサー率59% (260/439)
いくつか書き方はあると思いますが とりあえずこんな感じでどうでしょう SELECT 商品, Min(横), 縦 FROM テーブル WHERE 縦 = (SELECT MAX(縦) FROM テーブル) GROUP BY 商品, 縦; 詳細は「サブクエリ」あたりを検索してみてください
- investyou
- ベストアンサー率23% (13/56)
select 商品, min(横), max(縦) from tbl group by 商品
補足
これだと以下のようになると思います。 商品 横 縦 A 1 5 B 1 5
補足
WHERE 縦 = (SELECT MAX(縦) FROM テーブル) のように書いてしまうと、テーブルの最大値をとって きてしまうと思います。 商品ごとに最大値が違う場合は成り立たないですよね?