- 締切済み
SQLでの集計方法について
SQLでの集計方法がわからず質問をさせていただきます。 改版のたびに商品名を変える商品がたくさんあるとします。 (下記のような感じで、履歴番号が大きいほど新しい) 商品コード 履歴番号 商品名 123456 8 元祖○○ 123456 7 ○○外伝ターボ 123456 6 ○○外伝 123456 5 スーパー○○2 123456 4 スーパー○○ 123456 3 ○○3 123456 2 ○○2 123456 1 ○○ この場合に、各商品コードの履歴番号が最大(最新)の、 「商品コード」「改版履歴番号」「商品名」を取得するには どのようなSQLを作成すればいいでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- noah7150
- ベストアンサー率46% (116/251)
度々です。 #4の回答の複数行出力記述で変えるのは関数名 順位付けの方法が http://msdn.microsoft.com/ja-jp/library/ms189798.aspx このようにありますので
- noah7150
- ベストアンサー率46% (116/251)
ついでだからRowNumber手法も select * from ( select row_number() over (PARTITION BY 商品番号 order by 履歴番号 desc) 順,* from テーブル) where 順=1 順ってカラムが先頭に付きます。 今回の場合は履歴番号で必ず1つになりそうですが最大の物が2個になる場合、先の回答では2行出るので RowNumber関数の場合は PARTITION を変えれば2行出すことも可能だし 色々応用も効くと思いますので
- noah7150
- ベストアンサー率46% (116/251)
DBは何をお使いですか? 私が今使ってる環境では#2の回答者さまの構文で実行出来ませんでした。 (SQL Server 2005) なので他の参考として同じ手法で select I1.* from テーブル I1 inner join (select 商品番号, max(履歴番号) 最大番号 from テーブル group by 商品番号) I2 on I1.商品番号 = I2.商品番号 AND I1.履歴番号 = I2.最大番号 これならAccess、Oracleでも動くかな? Accessならエイリアスの I1, I2, 最大番号 の前にASをつけないといけないかも。 SQL ServerならRowNumber関数を使って順位を振り1番目だけを取り出す、なんてのが最近の手法かも http://msdn.microsoft.com/ja-jp/library/ms186734.aspx
- tostem41
- ベストアンサー率38% (7/18)
NO1です。 各商品ごとという条件を入れ忘れました。条件入れるとこんな感じです。 select * from テーブル where (商品番号,履歴番号) in (select 商品番号,max(履歴番号) from テーブル group by 商品番号)
- tostem41
- ベストアンサー率38% (7/18)
select * from テーブル名 where 履歴番号 = (select max(履歴番号) from テーブル名)
お礼
in()という句を使えばいいんですか! この用法を知りませんでしたので、大変参考になりました。 さっそく試してみたいと思います。 どうもありがとうございました!