jiichan.com

PROGRAMMING

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,1504,080
交通費250600
被服費5,3003,000