こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLでグルーピングしてやや複雑な集計する方法

SQLでグルーピングしてやや複雑な集計する方法

こういうことってやりたい時あるよなーと思いつつ
いい方法が思い浮かばないので質問させてください。
日付ごとにタイプなどの条件により集計して、
1行で1日分のデータを並べて出力したいと思っています。
とりあえずイメージを提示します。

テーブルイメージ
--------------------------
日付     額 タイプ
20090101  5000  1
20090101  1000  1
20090101  3000  2
20090101  2000  2
20090101  -200  4
20090101  3000  4
20090101  2000  4
20090102  1000  1
20090102  1000  2
20090102  1000  2
20090102  -100  4
20090102  4000  4
20090102  3000  4
--------------------------

出力イメージ
-----------------------------------------------------
日付   タイプ1 タイプ2 タイプ4(正) タイプ4(負)
20090101   6000   5000   5000   -200
20090102   2000   2000   7000   -100
-----------------------------------------------------

複問い合わせを駆使すればできるような気もするのですが、
日付で集計しなければならないところが難しく感じています。
合計が0(というか対象データが無い場合)の部分は空白でもかまいません。
データベースはOracleですがOracleだけでしか使えない特殊な機能ではなく
普通のSQLの組み合わせで解決したいと思っています。
(でもOracle固有の機能で解決できるのならそれも教えていただきたいです)

基本的に1発のSQLで表形式で帰ってくるSQLの書き方をお願いします。
できれば、SQLそのものを記述していただきたいです。
何回かSQLを発行してあとでエクセルで…とか、他のPG言語でなんとかする
という方法は今回はいりません。

よろしくお願いします。

投稿日時 - 2009-02-24 15:27:40

QNo.4745246

暇なときに回答ください

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

CASE式を使った例です。
select 日付
,sum( case when タイプ = 1 then 額 end ) "タイプ1"
,sum( case when タイプ = 2 then 額 end ) "タイプ2"
,sum( case when タイプ = 4 and 額 > 0 then 額 end ) "タイプ4(正)"
,sum( case when タイプ = 4 and 額 < 0 then 額 end ) "タイプ4(負)"
from テーブル
group by 日付;

ANSI標準構文ですし、最近のバージョンのRDBMSで有名どころなら
どれでも使えるはずです(ACCESSを除いて)。

投稿日時 - 2009-02-24 18:21:40

お礼

こんなにすっきりシンプルに書けるんですね。
大変参考になりました。ありがとうございました。

投稿日時 - 2009-02-25 08:43:15

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

Oracleはcase文を発行できるバージョンですか。
であれば以下のようなSQLで可能です。

select 日付,
SUM(case when タイプ=1 then 額 else 0 end )AS タイプ1,
SUM(case when タイプ=2 then 額 else 0 end )AS タイプ2,
SUM(case when タイプ=3 then 額 else 0 end )AS タイプ3,
SUM(case when タイプ=4 then 額 else 0 end )AS タイプ4
from table
group by 日付

投稿日時 - 2009-02-24 19:26:01

お礼

参考になりました。ありがとうございました。

投稿日時 - 2009-02-25 08:46:49

ANo.2

Oracleのバージョンは?

group byとsumに、caseまたはdecodeを組み合わせましょう。

クロス集計で検索すれば、いくらでもSQL例が出てくると思いますよ。

投稿日時 - 2009-02-24 16:00:17

お礼

検索してみます。
ありがとうございました。

投稿日時 - 2009-02-25 08:41:10

ANo.1

これでどうでしょう

SELECT
x.【年月日】, I, O, PP, PN
FROM
(SELECT distinct 【年月日】 FROM 【テーブル名】) x,
(SELECT 【年月日】, SUM(【額】) I FROM 【テーブル名】 WHERE 【タイプ】 = 1 GROUP BY 【年月日】) a,
(SELECT 【年月日】, SUM(【額】) O FROM 【テーブル名】 WHERE 【タイプ】 = 2 GROUP BY 【年月日】) b,
(SELECT 【年月日】, SUM(【額】) PP FROM 【テーブル名】 WHERE 【タイプ】 = 4 AND 【額】 > 0 GROUP BY 【年月日】) c,
(SELECT 【年月日】, SUM(【額】) PN FROM 【テーブル名】 WHERE 【タイプ】 = 4 AND 【額】 < 0 GROUP BY 【年月日】) d
WHERE
x.【年月日】 = a.【年月日】(+) AND
x.【年月日】 = b.【年月日】(+) AND
x.【年月日】 = c.【年月日】(+) AND
x.【年月日】 = d.【年月日】(+)

投稿日時 - 2009-02-24 15:54:30

お礼

一発で取得できました。
ありがとうございました。

投稿日時 - 2009-02-25 08:40:23

あなたにオススメの質問