ポイント
- 集計結果に関する条件分岐は
HAVING
句を使うことが一般的かもしれませんが- CASE式を使えば、SELECT句の中でも同等の条件が書けます
- MAX、MIN、SUM、COUNTといった集計関数は
-
WHERE
句やGROUP BY
句で指定した条件で集約することが一般的かもしれませんが- 集計関数のカッコ内でも使える(カッコ内はカラム名だけではなく、式を入れることもできる)
- なので、CASE式も使える
- 集計関数のカッコ内でも使える(カッコ内はカラム名だけではなく、式を入れることもできる)
-
実例
テーブルのイメージ
店舗と、その店舗で働くスタッフを表現する中間テーブルをイメージして欲しいです。
スタッフが働く店舗が複数ある場合、主に働いている店舗以外は0というフラグが割り当てられます。
(設計の良し悪しに関する言及は不要)
テーブルのデータのイメージ(テーブル名 shop_staffs
)
だいぶ簡略化しています。
店舗id(shop_id) | スタッフid(staff_id) | 主要店舗フラグ(main) |
---|---|---|
1 | 22 | 1 |
1 | 23 | 0 |
2 | 5 | 1 |
3 | 123 | 1 |
4 | 34 | 0 |
4 | 35 | 1 |
4 | 36 | 0 |
5 | 23 | 1 |
上記のテーブルに対して、1度のSQLで、以下のような条件のデータを取得したいとき
出力結果
スタッフid | 店舗id |
---|---|
1 | 22 |
2 | 5 |
3 | 123 |
4 | 35 |
5 | 23 |
店舗idの条件
- 働く店舗が
- 1つなら、その店舗のidを取得
- 複数なら、主要店舗idを取得
SELECT
staff_id AS 'スタッフid',
CASE WHEN COUNT(*) = 1 THEN MAX(shop_id)
ELSE MAX(CASE WHEN main = 1
THEN shop_id
ELSE NULL END)
END AS '店舗id'
FROM shop_staffs
GROUP BY staff_id
CASE式はどこでもかける
これまでに何回かCASE式を見てきましたが、CASE式はどこにでも書けます。
- SELECT 句
- WHERE 句
- GROUP BY 句
- HAVING 句
- ORDER BY 句
- 関数の引数
- 式の中(CASE式の中でも)
など
参照
18-20p
アウトプット100本ノック実施中