CASE式を使用することで、SQL中で条件制御を行うことが出来ます。
本記事では、集約(GROUP BY)を絡めるという応用的な使い方を紹介していきたいと思います。
集約での使用(変換した値を集約キーにする)
集約(GROUP BY)の中で使用することで、変換した値を集約キーにする事が出来ます。
例えば、年齢が20歳未満と20歳以上のグループに分けて集約する場合、以下となります。
SELECT CASE
WHEN age < 20 THEN 'YOUNG'
ELSE 'ADULT'
END attribute
,COUNT(*) cnt
,SUM(salary) sum_salary
FROM test_table
GROUP BY CASE
WHEN age < 20 THEN 'YOUNG'
ELSE 'ADULT'
END
;
ATTRIBUTE CNT SUM_SALARY
---------- ------- -----------
YOUNG 12 1500000
ADULT 25 6000000
条件付きで集計する
CASE式と集約関数を組み合わせることで、条件付きで集計する事が出来ます。
例えば、年齢が20歳未満の人数の合計と20歳以上の人数の合計を取得する場合、以下となります。
通常
SELECT COUNT(*) cnt
FROM test_table
WHERE age < 20 ; CNT ------- 12 SELECT COUNT(*) cnt FROM test_table WHERE age >= 20
;
CNT
-------
25
通常(UNION ALL使用)
SELECT 'YOUNG' attribute
,COUNT(*) cnt
FROM test_table
WHERE age < 20 UNION ALL SELECT 'ADULT' attribute ,COUNT(*) cnt FROM test_table WHERE age >= 20
;
ATTRIBUTE CNT
---------- -------
YOUNG 12
ADULT 25
条件付きで集計
SELECT SUM(CASE WHEN age < 20 THEN 1 ELSE 0 END) young_cnt
,SUM(CASE WHEN age >= 20 THEN 1 ELSE 0 END) adult_cnt
FROM test_table
;
YOUNG_CNT ADULT_CNT
---------- ----------
12 25
注目すべき点は、条件付きで集計で出力した場合は、それぞれを列として抽出している点です。
最終的にこの形式で出力したい場合、通常の場合はSELECT結果を外側のプログラムや手作業でピボット表の形式に整形する必要があります。
まとめ
本記事では、集約が絡んだ使い方を紹介しました。
CASE式は、応用することでSQLで出来ることが大きく広がります。
動作を理解し、ぜひ利用してみましょう。
関連(CASE式)
関連(DECODE関数)




