-PR-
  • 困ってます
  • 質問No.7666702
解決
済み

SQLで部分的にGROUP BYしたいとき

  • 閲覧数1425
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 77% (27/35)

はじめまして。
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
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル9

ベストアンサー率 76% (55/72)

--綺麗かどうかはともかく、かなり無理やり
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;
お礼コメント
ultra789

お礼率 77% (27/35)

実は一意になるキーはすでにカラムにもっています。
それをGROUP BYのELSEに入れれば、うまくいきそうです!
素晴らしい回答ありがとうございます!
投稿日時 - 2012-08-28 11:25:07
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル10

ベストアンサー率 53% (90/167)

SELECT 日付,SUM(金額) FROM 出納帳 GROUP BY 日付,CASE WHEN 金額>=0 THEN 金額 ELSE 0 END ORDER BY 1,2 でどうでしょうか。 (ただし、正の金額に同じ物があると合計されてしまいます) ...続きを読む
SELECT 日付,SUM(金額)
FROM 出納帳
GROUP BY 日付,CASE WHEN 金額>=0 THEN 金額 ELSE 0 END
ORDER BY 1,2
でどうでしょうか。
(ただし、正の金額に同じ物があると合計されてしまいます)
お礼コメント
ultra789

お礼率 77% (27/35)

なるほど!GROUP BYのなかでCASE文を使えばいいのですね!
正の金額に同じものがあると合計される仕様は許容できないので、このままは利用できませんが、
勉強になりました!
ありがとうございます!
投稿日時 - 2012-08-28 11:23:16
このQ&Aのテーマ
このQ&Aで解決しましたか?
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


-PR-

ピックアップ

-PR-
ページ先頭へ