CASE式を使ってみよう、応用編part2

ORACLE
20160115-1

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関数)

タイトルとURLをコピーしました