CASE WHEN: 条件でラベルを作る
Stage 1 — 第6章 | データ分析基礎カリキュラム 推定学習時間:35〜45分 | 難易度:★★☆☆☆
この章で学ぶこと
データ分析では、元データにない「見やすい分類」をSQL上で作りたい場面があります。 たとえば、注文金額から「高額注文」「通常注文」を分けたり、商品価格から価格帯を作ったりします。
このような条件付きのラベル作成に使うのが CASE WHEN です。
この章を終えると、こんなことができるようになります:
- 条件に応じて表示値を切り替えられる
- 数値を価格帯や注文ランクに変換できる
- ステータスコードを読みやすいラベルに変換できる
- 分析前の特徴量づくりの入口を理解できる
1. CASE WHENはSQLの条件分岐
CASE WHEN は、条件に応じて返す値を変える構文です。
基本形は次の通りです。
CASE
WHEN 条件1 THEN 値1
WHEN 条件2 THEN 値2
ELSE それ以外の値
END
たとえば、注文金額が10,000円以上なら「高額注文」、それ以外なら「通常注文」と表示します。
SELECT
order_id,
total_amount,
CASE
WHEN total_amount >= 10000 THEN '高額注文'
ELSE '通常注文'
END AS order_rank
FROM orders;
CASE で始まり、END で終わります。
作った結果には AS order_rank のように別名をつけると読みやすくなります。
2. なぜラベルを作るのか
元データの数値をそのまま見るだけでは、全体像をつかみにくいことがあります。
たとえば total_amount を1件ずつ見ても、注文の傾向は見えにくいです。
しかし、次のように分類すると、分析しやすくなります。
| total_amount | order_rank |
|---|---|
| 2500 | 少額注文 |
| 8200 | 通常注文 |
| 18000 | 高額注文 |
このような分類は、後の集計で役立ちます。 「高額注文は何件あるか」「価格帯ごとの購入率は違うか」といった分析につながります。
3. 複数条件で価格帯を作る
WHEN は複数書けます。
上から順に条件が評価され、最初に当てはまった結果が返ります。
SELECT
order_id,
total_amount,
CASE
WHEN total_amount >= 20000 THEN '20,000円以上'
WHEN total_amount >= 10000 THEN '10,000円以上20,000円未満'
WHEN total_amount >= 5000 THEN '5,000円以上10,000円未満'
ELSE '5,000円未満'
END AS amount_band
FROM orders;
このSQLでは、20,000円以上の注文は最初の条件で分類されます。 そのため、次の条件には進みません。
CASE WHEN では、条件の順番が重要です。
大きい金額から判定するのか、小さい金額から判定するのかで、結果が変わることがあります。
4. ELSEを書いて想定外を受け止める
ELSE は、どの WHEN にも当てはまらなかった場合の値です。
SELECT
order_id,
status,
CASE
WHEN status = 'completed' THEN '完了'
WHEN status = 'cancelled' THEN 'キャンセル'
WHEN status = 'pending' THEN '保留'
ELSE 'その他'
END AS status_label
FROM orders;
ELSE を書いておくと、想定外のステータスがあっても結果に表示できます。
もし ELSE を書かず、どの条件にも当てはまらない場合、結果はNULLになります。
分析用のSQLでは、想定外を見逃さないためにも ELSE 'その他' や ELSE '要確認' を入れることがあります。
5. NULLを含む場合のCASE WHEN
NULLを判定するときは、第5章と同じく IS NULL を使います。
SELECT
customer_id,
customer_name,
prefecture,
CASE
WHEN prefecture IS NULL THEN '都道府県未入力'
ELSE '都道府県入力済み'
END AS prefecture_status
FROM customers;
prefecture = NULL とは書きません。
NULLの条件分岐でも、IS NULL / IS NOT NULL を使います。
商品価格が未設定の商品を別ラベルにする例です。
SELECT
product_id,
product_name,
price,
CASE
WHEN price IS NULL THEN '価格未設定'
WHEN price >= 10000 THEN '高価格帯'
WHEN price >= 3000 THEN '中価格帯'
ELSE '低価格帯'
END AS price_band
FROM products;
NULLを先に判定しておくと、価格帯の分類で欠損を見落としにくくなります。
6. CASE WHENは集計の準備になる
このStageでは集計の詳しい構文は扱いませんが、CASE WHEN は集計と組み合わせるとさらに強力です。
たとえば、注文に金額帯ラベルをつけておけば、次のStageで金額帯ごとの注文数や平均金額を集計できます。
SELECT
order_id,
customer_id,
total_amount,
CASE
WHEN total_amount >= 10000 THEN '高額注文'
ELSE '通常注文'
END AS order_rank
FROM orders;
このように、元データから分析しやすい分類を作る作業は、実務では「特徴量を作る」作業の入口でもあります。 機械学習に進む前のデータ準備でも、同じ考え方がよく使われます。
7. 実務でよく使うラベル作成例
顧客の地域ラベル
SELECT
customer_id,
customer_name,
prefecture,
CASE
WHEN prefecture IN ('東京都', '神奈川県', '千葉県', '埼玉県') THEN '首都圏'
WHEN prefecture IS NULL THEN '未入力'
ELSE 'その他地域'
END AS area_group
FROM customers;
地域別分析の前処理として使えます。
商品の価格帯
SELECT
product_id,
product_name,
price,
CASE
WHEN price >= 10000 THEN '高価格帯'
WHEN price >= 3000 THEN '中価格帯'
WHEN price IS NULL THEN '価格未設定'
ELSE '低価格帯'
END AS price_band
FROM products;
この例では、条件順序に注意が必要です。
price IS NULL を先に書くほうが、欠損を明示的に扱っていることが伝わりやすくなります。
SELECT
product_id,
product_name,
price,
CASE
WHEN price IS NULL THEN '価格未設定'
WHEN price >= 10000 THEN '高価格帯'
WHEN price >= 3000 THEN '中価格帯'
ELSE '低価格帯'
END AS price_band
FROM products;
注文ステータスの読み替え
SELECT
order_id,
status,
CASE
WHEN status = 'completed' THEN '売上計上対象'
WHEN status = 'cancelled' THEN '除外対象'
ELSE '確認対象'
END AS sales_scope
FROM orders;
集計に含めるかどうかを確認するラベルとして使えます。
8. CASE WHENを書くときの注意点
条件の順番を確認する
次のSQLは、一見よさそうに見えますが問題があります。
CASE
WHEN total_amount >= 5000 THEN '5,000円以上'
WHEN total_amount >= 10000 THEN '10,000円以上'
ELSE '5,000円未満'
END
10,000円以上の注文も、最初の total_amount >= 5000 に当てはまってしまいます。
そのため、10,000円以上 には分類されません。
金額帯のような範囲分類では、条件の順番を慎重に決めましょう。
ラベルの意味を明確にする
高い, 低い, 良い, 悪い のようなラベルは、基準が曖昧になりがちです。
できれば、条件とラベルの対応がわかる名前にします。
10,000円以上5,000円以上10,000円未満都道府県未入力売上計上対象
分析結果を共有する相手が、SQLを見なくても意味を理解できるラベルを目指しましょう。
実務での使いどころ: 分析用のラベルを作る
CASE WHEN は、データを分析しやすいカテゴリへ変換するときによく使います。 たとえば、注文金額を「低単価」「中単価」「高単価」に分けると、金額帯ごとの購買傾向を見やすくなります。
SELECT
order_id,
total_amount,
CASE
WHEN total_amount >= 10000 THEN 'high'
WHEN total_amount >= 5000 THEN 'middle'
ELSE 'low'
END AS amount_segment
FROM orders;
CASE WHENで作ったラベルは、後続のGROUP BYやダッシュボードで使われます。 そのため、ラベルの境界や意味をチームで説明できることが重要です。
| ラベル設計で確認すること | 理由 |
|---|---|
| 境界値 | 5,000円以上をどちらに含めるか迷わないため |
| ELSE | 想定外の値を落とさないため |
| NULLの扱い | 未設定値を誤分類しないため |
| ラベル名 | ダッシュボード利用者が意味を理解できるため |
ラベルは分析者の判断を含みます。 SQLに書いた条件を、自然言語でも説明できるようにしましょう。
ミニ演習
次のラベルをCASE WHENで作るとしたら、条件を考えてください。
- 注文金額を
low,middle,highに分ける。 - 顧客の都道府県を
首都圏とその他に分ける。 - 注文ステータスを
完了,未完了,確認必要に分ける。 - ELSEを書かない場合に起きるリスクを説明する。
まとめ
| 構文 | 意味 | 例 |
|---|---|---|
CASE WHEN |
条件で返す値を変える | WHEN amount >= 10000 THEN '高額' |
ELSE |
どの条件にも当てはまらない場合 | ELSE 'その他' |
END |
CASE式の終了 | END AS label |
IS NULL |
NULLの判定 | WHEN price IS NULL THEN '未設定' |
この章のキーメッセージ:
CASE WHEN は、元データを分析しやすいラベルに変換するための基本技術です。条件の順番とラベルの意味を明確にし、後の集計やレポートにつながる形で使いましょう。
この章の確認
CASE WHENの基本構文を説明してください。total_amountが10,000円以上なら「高額注文」、それ以外なら「通常注文」と表示するSQLを書いてください。- 複数条件の
CASE WHENで、条件の順番が重要になる理由を説明してください。 - NULLを含む列で条件分岐するとき、どのような書き方を使いますか?