3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CASE式の中で集約関数を使って普通は2回SQLを書くところを1回で済ませるテクニック

Last updated at Posted at 2021-07-31

ポイント

  • 集計結果に関する条件分岐は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本ノック実施中

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?