※これはミック(2018),『達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ」』[第2版],翔泳社のメモです。
私が特に役立つと思った事柄の書き起こしですので、もっと知りたい方は文献を参考にしてください(最後に記述)
CASE文の基本書式
CASE文基本書式
-- 単純CASE式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE 'その他' END
-- 検索CASE式
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE 'その他' END
どちらを使用するかはケースバイケースである。
CASE文は真になるWHEN句が存在した時点で即終了となり
残りのWHEN句は無視される。
WHEN句
-- 以下の場合、2行目のWHEN句は無視される
CASE WHEN col_1 IN ('a','b') THEN '1番'
WHEN col_2 IN ('a') THEN '2番'
ELSE 'その他' END
CASE式はSELECT文でつけた別名をGROUP BYで指定できる
以下のような表を県名と男女別にまとめた結果を取得するとする。
■集計元
pref_name(県名) | poplation(人口) |
---|---|
徳島 | 100 |
香川 | 200 |
愛媛 | 150 |
高知 | 200 |
福岡 | 300 |
佐賀 | 100 |
長崎 | 200 |
東京 | 400 |
群馬 | 50 |
■集計結果
地域 | 人口 |
---|---|
四国 | 650 |
九州 | 600 |
その他 | 450 |
以下のSQLで取得できる。
CASE式のGROUP BY
-- 地域コードcolumn増やせばいいが、今回は無視
SELECT CASE pref_name
WHEN '徳島' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '愛媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福岡' THEN '九州'
WHEN '佐賀' THEN '九州'
WHEN '長崎' THEN '九州'
ELSE 'その他' END AS district,
SUM (poplation) AS poplation
FROM '集計元'
GROUP BY district;
UNIONよりCASE文
以下のような表を県名と男女別にまとめた結果を取得するとする。
■集計元
pref_name(県名) | sex(性別) | poplation(人口) |
---|---|---|
徳島 | 1 | 60 |
徳島 | 2 | 40 |
香川 | 1 | 100 |
香川 | 2 | 100 |
愛媛 | 1 | 100 |
愛媛 | 2 | 50 |
高知 | 1 | 100 |
高知 | 2 | 100 |
福岡 | 1 | 100 |
福岡 | 2 | 200 |
佐賀 | 1 | 20 |
佐賀 | 2 | 80 |
長崎 | 1 | 125 |
長崎 | 2 | 125 |
東京 | 1 | 250 |
東京 | 2 | 150 |
■集計結果
県名 | 男 | 女 |
---|---|---|
徳島 | 60 | 40 |
香川 | 100 | 100 |
愛媛 | 100 | 50 |
高知 | 100 | 100 |
福岡 | 100 | 200 |
佐賀 | 20 | 80 |
長崎 | 125 | 125 |
東京 | 250 | 150 |
以下のクエリでも取得できるが、CASE文を使うとさらに効率よく取得可能
UNION
(
SELECT pref_name,sum(poplation)
FROM syuukei_table
WHERE sex = 1
GROUP BY pref_name
)UNION (
SELECT pref_name,sum(poplation)
FROM syuukei_table
WHERE sex = 2
GROUP BY pref_name
)
CASE文を使用した例
SELECT pref_name,
-- 男性
SUM( CASE WHEN sex = 1 THEN poplation ELSE 0 END) AS cnt_m,
-- 女性
SUM( CASE WHEN sex = 2 THEN poplation ELSE 0 END) AS cnt_f
FROM syuukei_table
GROUP BY pref_name;
参考文献
ミック(2018),『達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ」』[第2版],翔泳社