2017/12/07
CASE式を使用することで、SQL中で条件制御を行うことが出来ます。
本記事では、集約(GROUP BY)を絡めるという応用的な使い方を紹介していきたいと思います。
sponsored link
集約での使用(変換した値を集約キーにする)
集約(GROUP BY)の中で使用することで、変換した値を集約キーにする事が出来ます。
例えば、年齢が20歳未満と20歳以上のグループに分けて集約する場合、以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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歳以上の人数の合計を取得する場合、以下となります。
通常
1 2 3 4 5 6 7 8 |
SELECT COUNT(*) cnt FROM test_table WHERE age < 20 ; CNT ------- 12 SELECT COUNT(*) cnt FROM test_table WHERE age >= 20 ; CNT ------- 25 |
通常(UNION ALL使用)
1 2 3 4 5 6 7 8 9 10 |
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 |
条件付きで集計
1 2 3 4 5 6 7 8 |
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関数)