プロが教える店舗&オフィスのセキュリティ対策術

はじめまして。
SQLで部分的にGROUP BYで集計したいのですが、
どうもしっくりくるSQLがかけません。
多分CASEあたりを使うと綺麗で高速なSQLがかけると思っています。
皆様のお知恵をお借りしたく投稿しました。

具体的には以下のような出納帳データで

出納帳
日付     金額
2012/8/20 1000
2012/8/20 2000
2012/8/21 -1000
2012/8/21 -2000
2012/8/22 3000
2012/8/23 4000
2012/8/24 -3000
2012/8/24 -4000
2012/8/27 5000

↓集計

日付     金額
2012/8/20 1000
2012/8/20 2000
2012/8/21 -3000(-1000と-2000を集約)
2012/8/22 3000
2012/8/23 4000
2012/8/24 -7000(-3000と-4000を集約)
2012/8/27 5000

というように、マイナスの金額は集約してしまいたいのですが、どのようなSQLが最適でしょうか?
とりあえず、UNIONかなと思い、

(SELECT 日付, 金額
FROM 出納帳
WHERE 金額>=0
UNION ALL
SELECT 日付, 金額
FROM 出納帳
WHERE 金額<0
GROUP BY 日付 )
ORDER BY 日付

とプラス金額とマイナス金額にわけUNIONしたのですが、
もっと綺麗(高速)にやる方法があるのではないか?と思い投稿いたしました。
なにかヒントございましたら、ご教授ください。

DB環境:Oracle 11g

A 回答 (2件)

--綺麗かどうかはともかく、かなり無理やり


SELECT 日付, SUM(金額) AS 金額
FROM (
SELECT 日付, 金額,
ROW_NUMBER() OVER (PARTITION BY 日付 ORDER BY 金額) AS id
FROM 出納帳
)
GROUP BY 日付, CASE WHEN 金額 < 0 THEN 0 ELSE id END;
    • good
    • 1
この回答へのお礼

実は一意になるキーはすでにカラムにもっています。
それをGROUP BYのELSEに入れれば、うまくいきそうです!
素晴らしい回答ありがとうございます!

お礼日時:2012/08/28 11:25

SELECT 日付,SUM(金額)


FROM 出納帳
GROUP BY 日付,CASE WHEN 金額>=0 THEN 金額 ELSE 0 END
ORDER BY 1,2
でどうでしょうか。
(ただし、正の金額に同じ物があると合計されてしまいます)
    • good
    • 1
この回答へのお礼

なるほど!GROUP BYのなかでCASE文を使えばいいのですね!
正の金額に同じものがあると合計される仕様は許容できないので、このままは利用できませんが、
勉強になりました!
ありがとうございます!

お礼日時:2012/08/28 11:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A