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言語でなんとかする
という方法は今回はいりません。
よろしくお願いします。
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を除いて)。
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 日付
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.【年月日】(+)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- MySQL #1062 - '0' は索引 'PRIMARY' で重複しています。とでています。 1 2023/01/01 06:13
- SQL Server SQL 期間内の実施数を合計したい 2 2023/03/03 22:28
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- SQL Server 2つのSQL(Access)の結果[時刻,カウント数]を結合して集計する方法 1 2022/04/06 22:57
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- その他(Microsoft Office) ピボットテーブルへの集計フィールド挿入 1 2023/02/26 11:33
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- SQL Server これをSQL文で出来るでしょうか? 1 2023/03/26 02:16
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLサーバで和暦から西暦に変換...
-
エクセル 日付による並べ替え...
-
Excelの並び替え(先頭の文字以...
-
今日の日付が入った行のデータ...
-
ExcelのSUMPRODUCTで日付の範囲...
-
SQL/Loaderでの年月日時分秒の...
-
Oracle10gのsql分についての質...
-
指定した年月までのデータを取...
-
SELECT結果の縦と横の入れ替え
-
oracle 文字列 01:45 を時間に...
-
特定の日付が第何週目にあるか...
-
SQLで部分的にGROUP BYしたいとき
-
WHERE句にて「30日前から今日ま...
-
23時59分59秒までのデータを抽...
-
バイナリファイルからの文字列抽出
-
エクセル上の8桁の数字を一括し...
-
Accessの数値から時間に変換す...
-
日数算出SQL
-
エクセルと日付の関数と並び替え
-
最新日付のデータを取得したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessの数値から時間に変換す...
-
今日の日付が入った行のデータ...
-
SQLで部分的にGROUP BYしたいとき
-
SQLサーバで和暦から西暦に変換...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
エクセル 日付による並べ替え...
-
テーブルの主キーをdate型...
-
重複するIDのデータを1行にま...
-
oracle 文字列 01:45 を時間に...
-
日付型なら変数の先頭になん...
-
指定した年月までのデータを取...
-
Excelグラフの日付軸の日付がず...
-
日付書式に変換でこまっています!
-
エクセルVBA 今日の日付行...
-
wordの差し込み印刷での日付表示
-
日付の切り出し方法について
-
yyyy/M/dをyyyy/MM/ddに変換
-
SQL ブレーク処理について
-
23時59分59秒までのデータを抽...
-
WHERE句にて「30日前から今日ま...
おすすめ情報