• ベストアンサー

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言語でなんとかする という方法は今回はいりません。 よろしくお願いします。

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

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を除いて)。

pringlez
質問者

お礼

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

その他の回答 (3)

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.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 日付

pringlez
質問者

お礼

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

回答No.2

Oracleのバージョンは? group byとsumに、caseまたはdecodeを組み合わせましょう。 クロス集計で検索すれば、いくらでもSQL例が出てくると思いますよ。

pringlez
質問者

お礼

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

  • mibusys
  • ベストアンサー率60% (18/30)
回答No.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.【年月日】(+)

pringlez
質問者

お礼

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