- ベストアンサー
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言語でなんとかする という方法は今回はいりません。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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を除いて)。
その他の回答 (3)
- 3rd_001
- ベストアンサー率66% (115/174)
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 日付
お礼
参考になりました。ありがとうございました。
- chukenkenkou
- ベストアンサー率43% (833/1926)
Oracleのバージョンは? group byとsumに、caseまたはdecodeを組み合わせましょう。 クロス集計で検索すれば、いくらでもSQL例が出てくると思いますよ。
お礼
検索してみます。 ありがとうございました。
- mibusys
- ベストアンサー率60% (18/30)
これでどうでしょう 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.【年月日】(+)
お礼
一発で取得できました。 ありがとうございました。
お礼
こんなにすっきりシンプルに書けるんですね。 大変参考になりました。ありがとうございました。