PROGRAMMING
Warning: Invalid argument supplied for foreach() in /home/mmken1/jiichan.com/public_html/programming/programming.php on line 96
CASE式でクロス集計
以前、現役時代には問題なく使っていたCASE式やCASE文ですが、 使おうとして忘れかけていたことに気づき、メモを残すことにしました。
CASE式の書式
CASE式の書式には二通りあります。
書式1
CASE [列名]
WHEN [列の値]
THEN [列名=列の値のときの返り値(列名か固定値)]
ELSE [列名<>列の値のときの返り値(列名か固定値)]
END
書式2
CASE
WHEN [式]
THEN [式が成立するときの返り値(列名か固定値)]
ELSE [式が成立しないときの返り値(列名か固定値)]
END
二番目の書式の方が柔軟性があると思います。なお、WHENとTHENは複数記述できます。
使い方
次のテーブルを例にします。家計簿テーブルの一部ですが、これをクロス集計して各月の費目を集計します。
【テーブル:家計簿】
月日 | 費目 | 金額 |
---|---|---|
10月30日 | 食費 | 2,500 |
10月31日 | 食費 | 1,200 |
11月01日 | 被服費 | 3,000 |
11月01日 | 食費 | 1,350 |
11月02日 | 食費 | 2,230 |
11月02日 | 交通費 | 320 |
10月30日 | 食費 | 1,450 |
10月30日 | 交通費 | 250 |
10月31日 | 被服費 | 5,300 |
11月01日 | 食費 | 500 |
11月02日 | 交通費 | 280 |
CASE式の例
SELECT 費目,
SUM(CASE WHEN LEFT(月日, 2) = '10' THEN 金額 END) AS 10月,
SUM(CASE WHEN LEFT(月日, 2) = '11' THEN 金額 END) AS 11月
FROM 家計簿 GROUP BY 費目;
まず、費目を月別に集計するので、費目をGROUP BYでグループにまとめます。
つづいて、SELECTする列を費目・10月(計算された列)・11月(計算された列)としています。
10月を例にとった場合、月日の値の左から二文字が10、つまり10月の場合はグループ化された費目の金額をSUMで合計しています。
注意として、上のテーブルは10月と11月のデータだけなのでELSEを記述していませんが、
それ以外のデータがあるときはELSEで10月と11月以外の場合の対処が必要です。
結果セットは次のとおりです。
費目 | 10月 | 11月 |
---|---|---|
食費 | 5,150 | 4,080 |
交通費 | 250 | 600 |
被服費 | 5,300 | 3,000 |
- 参考にさせていただいたサイト
- http://codezine.jp/article/detail/404?p=1