-PR-
締切り
済み

SQLで部分的にGROUP BYしたいとき(その2

  • 困ってます
  • 質問No.7670409
  • 閲覧数384
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 77% (27/35)

こんばんわ。
先日こちら(http://oshiete.goo.ne.jp/qa/7666702.html)
で質問させていただきましたが、まだ問題があったため、
再度質問させていただきます。
以下のような20カラムある「出納帳」テーブルがあって、
同一日付の金額を集約してしまいたいです。

出納帳
ID 日付   金額 伝票 ・・・(全20カラム)
1 2012/8/20 1000 A01 ・・・
2 2012/8/20 2000 A02 ・・・
3 2012/8/21 -1000 B01 ・・・
4 2012/8/21 -2000 B02 ・・・
5 2012/8/22 3000 A03 ・・・
6 2012/8/23 4000 A04 ・・・
7 2012/8/24 -3000 B03 ・・・
8 2012/8/24 -4000 B04 ・・・
9 2012/8/27 5000 A05 ・・・

↓「日付」で金額集約

ID 日付   金額 伝票 ・・・(全20カラム)
1 2012/8/20 1000 A01 ・・・
2 2012/8/20 2000 A02 ・・・
 2012/8/21 -3000    ・・・(-1000と-2000を集約)
5 2012/8/22 3000 A03 ・・・
6 2012/8/23 4000 A04 ・・・
 2012/8/24 -7000    ・・・(-3000と-4000を集約)
9 2012/8/27 5000 A05 ・・・


と集約キー以外はNULLにしたいのですが、
またまた、

(
SELECT ID, 日付, 金額, 伝票, ・・・
FROM  出納帳
WHERE  金額>=0
UNION ALL
SELECT NULL, 日付, SUM(金額), NULL, ・・・
FROM  出納帳
WHERE  金額<0
GROUP BY 日付
)
ORDER BY 日付

とUNIONをする方法しか思いつかなかったのですが、
UNIONせずに端的に表現できるSQLはありますでしょうか?
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.1
レベル9

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

--端的かどうかはともかく…… SELECT MAX(CASE WHEN 金額 < 0 THEN NULL ELSE ID END) AS ID, 日付, SUM(金額) AS 金額, MAX(CASE WHEN 金額 < 0 THEN NULL ELSE 伝票 END) AS 伝票 FROM 出納帳 GROUP BY 日付, CASE WHEN 金額 < 0 THEN 0 ELSE I ...続きを読む
--端的かどうかはともかく……
SELECT
MAX(CASE WHEN 金額 < 0 THEN NULL ELSE ID END) AS ID,
日付, SUM(金額) AS 金額,
MAX(CASE WHEN 金額 < 0 THEN NULL ELSE 伝票 END) AS 伝票
FROM 出納帳
GROUP BY 日付, CASE WHEN 金額 < 0 THEN 0 ELSE ID END;
--UNION使ったほうが分かりやすくていいかも……
お礼コメント
ultra789

お礼率 77% (27/35)

前回に引き続きご回答ありがとうございます。
なるほど!そうすればUNIONを用いずできますね!
ですが、たしかに仰るとおり、SELECT句が複雑だなと感じます。
可読性の意味でメンテが難しいかなとおもいます。
投稿日時 - 2012-08-30 12:12:07
  • 回答No.2
レベル12

ベストアンサー率 35% (313/889)

これって、単に金額が+なら、1行ずつ出力して、 -なら、日付でgroup byして出力したいってこと? SELECT case when 金額>0 then ID else Null end, 日付, sum(金額), case when 金額>0 then 伝票 else Null end, ・・・ FROM  出納帳 group by case when 金額>0 then ID ...続きを読む
これって、単に金額が+なら、1行ずつ出力して、
-なら、日付でgroup byして出力したいってこと?

SELECT case when 金額>0 then ID else Null end, 日付, sum(金額),
case when 金額>0 then 伝票 else Null end, ・・・
FROM  出納帳
group by case when 金額>0 then ID else Null end, 日付,
case when 金額>0 then 伝票 else Null end, ・・・
order by 日付,case when 金額>0 then ID else Null end

ででるはずですが(未検証ですが。)
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ