- 締切済み
SQLで部分的にGROUP BYしたいとき(その2
こんばんわ。 先日こちら(http://okwave.jp/qa/q7666702.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)
- 専門家の回答
みんなの回答
- Siegrune
- ベストアンサー率35% (316/895)
これって、単に金額が+なら、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 ででるはずですが(未検証ですが。)
- dda167
- ベストアンサー率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 ID END; --UNION使ったほうが分かりやすくていいかも……
お礼
前回に引き続きご回答ありがとうございます。 なるほど!そうすればUNIONを用いずできますね! ですが、たしかに仰るとおり、SELECT句が複雑だなと感じます。 可読性の意味でメンテが難しいかなとおもいます。