- ベストアンサー
検索SQLについて
SQL初心者です。 SQL文1つで以下のようなことをしたいんですが いい方法が思いつかなくて大変困ってします。 いい方法がありましたら教えてください。 以下のようなデータがあるとして 電話番号、商品名 、日付 、数量 00000001、商品AAA、2004/10/10、1 00000001、商品AAA、2004/10/10、2 00000001、商品BBB、2004/10/10、1 00000002、商品AAA、2004/10/09、2 00000002、商品AAA、2004/10/10、1 00000003、商品AAA、2004/10/10、1 00000003、商品AAA、2004/10/10、1 電話番号と商品名が同じ場合は (1)日付(降順) (2)数量(昇順) の順に比較して1つだけに絞って取得したい 「取得結果」 電話番号、商品名 、日付 、数量 00000001、商品AAA、2004/10/10、1 00000001、商品BBB、2004/10/10、1 00000002、商品AAA、2004/10/09、2 00000003、商品AAA、2004/10/10、1 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これでどうかな? select 電話番号, 商品名, max(日付), 数量 from テーブル名 A, (select 電話番号, 商品名, 日付, min(数量) 最小数量 from テーブル名 group by 電話番号, 商品名, 日付) B where A.電話番号 = B.電話番号 and A.商品名 = B.商品名 and A.数量 = B.最小数量 group by 電話番号, 商品名, 数量
その他の回答 (1)
- shangzi
- ベストアンサー率47% (17/36)
select A.電話番号,A.商品名,A.日付降順,min(B.数量) 数量昇順 from (select 電話番号,商品名,min(日付) 日付降順 from テーブル名 group by 電話番号,商品名) A --このインラインビューで電話番号、商品名毎の最小日付を取得します。 ,テーブル名 B where A.電話番号 = B.電話番号 and A.商品名 = B.商品名 and A.日付降順 = B.日付; --日付最小のうちの数量最大レコードが取得されます。 group by電話番号, 商品名, 日付降順 で出来るかなぁと思います・・・ NO1さんの考え方と基本的に同じですが、 >電話番号と商品名が同じ場合は >(1)日付(降順) >(2)数量(昇順) >の順に比較して1つだけに絞って取得したい との事ですので、日付を先に絞ることをお勧めします。 例に挙げられているデータではそこの優先順位を測りかねたのですが・・・ 結果的に取得されるレコードが逆になってしまうと思いますので、ご注意ください。 インラインビュー(副問合せ)内では、優先度が高い順に取得するようにお勧めします。 あと、日付降順ってのは日付の古い方から。数量昇順ってのは数量の低い方から。の並べ方と思っています。 もし、新しい日付順に取得したいのでしたら、min(日付)のとこをmax(日付)に変えてください。 最初は、Distinct とか rownum で簡単に取得できるかと思ったのですが・・・1個のSQLで取得するのはなかなか難しいですね~。勉強になりました。ありがとうございます。