@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

DB2で集計結果をTOP指定する方法

投稿者投稿内容
グレハン
常連さん
会議室デビュー日: 2006/02/23
投稿数: 25
投稿日時: 2006-03-20 14:25
いつも拝見させていただいております。
DB2初心者です。

使用しているDBはDB2です。

以下のテーブル(TBL_MONEY)から

TBL_MONEY
KEY1 | KEY2 | KEY3 | MONEY
A | A1 | a1 | 10
A | A1 | a2 | 20
A | A1 | a3 | 30
A | A2 | a1 | 120
B | B1 | b1 | 50
B | B1 | b2 | 60
B | B1 | b3 | 70
B | B2 | b1 | 10
B | B2 | b2 | 30
B | B3 | b1 | 70

SQLを実行して
(SQL)
SELECT KEY1, KEY2 ,SUM(MONEY) MONEY
FROM TBL_MONEY
GROUP BY KEY1, KEY2

(結果)
KEY1 | KEY2 | MONEY
A | A1 | 60
A | A2 | 120
B | B1 | 180
B | B2 | 40
B | B3 | 70

が求まるのですが、MONEYの降順で上位2つを取るというSQLはどのように
書けばいいのでしょか?

(欲しい結果)
KEY1 | KEY2 | MONEY
A | A2 | 120
A | A1 | 60
B | B1 | 180
B | B3 | 70

ご教授よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-20 16:05
SQLの途中から書きますが、

コード:
order by money desc fetch first 2 rows only


グレハン
常連さん
会議室デビュー日: 2006/02/23
投稿数: 25
投稿日時: 2006-03-20 16:41
かつのり様 御返事ありがとうございます。

>order by money desc fetch first 2 rows only

教えていただいたSQLですと、

(結果)
KEY1 | KEY2 | MONEY
B | B1 | 180
A | A2 | 120

となってしまいます。
KEY1に対してTOP2という指定はできないのでしょうか?

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-20 17:26
そう意味でしたか・・・失礼しました。
TOP句のような一発指定の方法は、私は知らないですね。

主キーだけで優劣を決めれるのであれば、
サブクエリを駆使すれば上位2件のみの取得も可能ですが、
主キーではないカラムの値では無理でしょう。

SQLで無理をするより、取得する側で工夫する方が早いと思います。
グレハン
常連さん
会議室デビュー日: 2006/02/23
投稿数: 25
投稿日時: 2006-03-20 17:54
かつのり様 御返答ありがとうございました。

今回の件は、ご指摘の様にSQLでは無理をせずにアプリ側で工夫しようと思います。

もしご存知の方がいらっしゃいましたら、今後参考にさせて頂きたいと思いますので、
レスの方、よろしくお願い致します。
どうもありがとうございました。
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2006-03-20 21:24
こんなので出来ませんか?
コード:
SELECT KEY1, KEY2, MONEY

FROM (SELECT KEY1, KEY2, MONEY
, ROWNUMBER() OVER(PARTITION BY KEY1
ORDER BY MONEY DESC) RN
FROM (SELECT KEY1, KEY2 ,SUM(MONEY) MONEY
FROM TBL_MONEY
GROUP BY
KEY1, KEY2
) Q
) R
WHERE RN <= 2
ORDER BY
KEY1, RN




[ メッセージ編集済み 編集者: とんくま 編集日時 2006-03-20 21:37 ]
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2006-03-20 22:36
こちらの方が、多少簡単で良いでしょう。
コード:
SELECT KEY1, KEY2, MONEY
  FROM (SELECT KEY1, KEY2, SUM(MONEY) MONEY
             , ROWNUMBER() OVER(PARTITION BY KEY1
                                    ORDER BY SUM(MONEY) DESC) RN
          FROM TBL_MONEY 
         GROUP BY
               KEY1, KEY2
       ) R
 WHERE RN <= 2
 ORDER BY
       KEY1, RN;



かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-21 02:30
なるほど。そんな方法があったのですね。
勉強になりました。

(OLAP系は各ベンダー毎に全く違うので、覚えるのが大変ですね。。。)

スキルアップ/キャリアアップ(JOB@IT)