この記事では、SQLを書いているときによく使う便利な構文「CASE文」を紹介します。
ちなみに例で使うSQLは以下のようなテーブルにクエリを投げている前提で記述しています
テーブル名: users
id | age | gender | point |
---|---|---|---|
1 | 10 | 0 | 40 |
2 | 20 | 1 | 50 |
3 | 30 | 0 | 60 |
4 | 40 | 1 | 70 |
条件ごとにラベルを付与したい時
CASE文を使うことで、各条件ごとにデータにラベルを付与することができます。
今回は例として、以下のようなラベルを付与したいと思います。
- ageが20以下→young
- ageが20より大きい→youth
SELECT CASE WHEN age <= 20 THEN 'young' ELSE 'youth' END AS segment, gender, point
FROM users
この結果は以下のようになります。
segment | gender | point |
---|---|---|
'young' | 0 | 40 |
'young' | 1 | 50 |
'youth' | 0 | 60 |
'youth' | 1 | 70 |
条件ごとにグループ化したい時
一つ目の例の応用として、データを定義したセグメントごとの人数などを出すことができます。
SELECT CASE WHEN age <= 20 THEN 'young' ELSE 'youth' END AS segment, COUNT(1) AS cnt
FROM users
GROUP CASE WHEN age <= 20 THEN 'young' ELSE 'youth' END
この結果は以下のようになります。
segment | cnt |
---|---|
'young' | 2 |
'youth' | 2 |
特定の条件の数を数え上げる
CASE文は集約関数と一緒に以下のように使うこともできます。
例として「ポイントが60以上のユーザーの数と割合」を出してみたいと思います
SELECT SUM(CASE WHEN point >= 60 THEN 1 ELSE 0 END) AS pass_count, SUM(CASE WHEN point >= 60 THEN 1 ELSE 0 END) * 1.0 / COUNT(1) AS pass_rate
FROM users
結果は以下のようになります。
pass_count | pass_rate |
---|---|
2 | 0.5 |
最後に
SQLはこのようなリファレンスには載っていないようなテクニックが多くあります。
また別の記事で紹介していければと思います。