重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

こんばんわ。
先日こちら(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はありますでしょうか?

A 回答 (2件)

これって、単に金額が+なら、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

ででるはずですが(未検証ですが。)
    • good
    • 0

--端的かどうかはともかく……


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使ったほうが分かりやすくていいかも……
    • good
    • 0
この回答へのお礼

前回に引き続きご回答ありがとうございます。
なるほど!そうすればUNIONを用いずできますね!
ですが、たしかに仰るとおり、SELECT句が複雑だなと感じます。
可読性の意味でメンテが難しいかなとおもいます。

お礼日時:2012/08/30 12:12

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