【SQL・DB基礎編 第3回】SQLで条件分岐!「DISTINCT」と「CASE式」でデータを高度に仕分けよう
基礎編の連載も第3回となりました。前回は「データの型変換(CAST)」という、少しマニアックですが実務で必ず直面する罠の回避方法を学びましたね。
さて、私たちが普段PythonやC言語などのプログラミング言語を書くとき、当たり前のように使っている機能があります。それが「if文(条件分岐)」です。
「もし〇〇ならAの処理、そうでないならBの処理をする」というアレですね。
実は、データベースからデータを引っ張り出すSQLの中でも、この「条件分岐」を行うことができるのをご存知でしょうか?
今回は、大量のデータからスマートに重複を消し去る「DISTINCT」と、SQLの中でif文のような柔軟な処理を実現する「CASE」について解説します。
これを使えるようになると、SQL単体でできるデータ分析の幅が劇的に広がります!
1. データの「重複」をスマートに排除する(DISTINCT)
まず本題の条件分岐に入る前に、実務で非常によく使う便利なキーワードを1つ紹介します。
例えば、全国にいる顧客のデータ(KOKYAKUテーブル)から、「当社の顧客は、どの都道府県(PREF)に住んでいるのか?」というリストを出したいとします。
単純に SELECT PREF FROM KOKYAKU; と実行すると、どうなるでしょうか?
結果は「東京都、東京都、大阪府、東京都、神奈川県、大阪府…」というように、全顧客の都道府県がそのままの数だけズラッと出力されてしまいます。欲しいのは「種類のリスト(重複のない一覧)」ですよね。
こんな時に活躍するのが DISTINCT です。
SELECT DISTINCT PREF
FROM KOKYAKU;SELECT の直後に DISTINCT を入れるだけで、データベースが自動的に重複を弾き、以下のようにスッキリとした「ユニークな(一意の)リスト」を返してくれます。

「このテーブルには、どんな種類の商品カテゴリが存在するんだっけ?」といった、データの中身をざっくり把握したい時にめちゃくちゃ重宝するコマンドです。
2. SQLの中で「条件分岐」を作る(CASE式)
それでは本題です。
例えば、商品テーブル(SHOHIN)からデータを取得する際、「価格(PRICE)が5000円以上のものは『高級品』、それ未満のものは『普及品』というラベルを付けて出力したい」というオーダーがあったとします。
元のテーブルにはそんなラベル(列)は存在しません。抽出するその瞬間に、条件に応じてデータを切り替えたい。ここで登場するのが CASE式 です。
SELECT
SNAME,
PRICE,
CASE
WHEN PRICE >= 5000 THEN '高級品'
ELSE '普及品'
END AS RANKING
FROM SHOHIN;構文は英語を読むように直感的です。
CASE:条件分岐を始めます。
WHEN 条件 THEN 結果:「もし条件を満たしたら、この結果を出力する」
ELSE 結果:「上のどの条件にも当てはまらなかったら、この結果を出力する」
END:条件分岐を終わります。
これを実行すると、以下のように「RANKING」という新しい列が作られ、条件に応じたテキストが割り当てられます。

WHEN は複数書くことができるため、「10000円以上ならSランク、5000円以上ならAランク、それ以外はBランク…」といった複雑なラベリングも自由自在です。
3. 【応用】CASE式と集計の合わせ技(クロス集計)
CASE式が本当に真価を発揮するのは、入門編で学んだ「集計関数(SUMなど)」と組み合わせた時です。
例えば、「高級品と普及品、それぞれいくつあるか(何種類あるか)カウントしたい」という場合、CASE式と SUM を組み合わせることで、擬似的なクロス集計(ピボットテーブル)を作ることができます。
SELECT
SUM(CASE WHEN PRICE >= 5000 THEN 1 ELSE 0 END) AS 高級品の数,
SUM(CASE WHEN PRICE < 5000 THEN 1 ELSE 0 END) AS 普及品の数
FROM SHOHIN;このSQLが何をしているか分かりますか?
「価格が5000円以上なら 1、違うなら 0」という数字を裏側で作り、それを SUM で全部足し合わせているのです。結果として、条件に合致するデータだけの件数を横並びで出力することができます。

BIツールやPython(Pandasなど)を使わなくても、SQLのコード一本でここまで高度な集計表を作成できるのが、CASE式の恐ろしいところです。
まとめ
今回は、データをより高度に仕分ける2つのテクニックを学びました。
DISTINCT:データの重複を排除し、ユニークなリストを作る。
CASE式:SQLの中で「if文」のような条件分岐を行い、新しい軸でデータを分類・集計する。
特に CASE 式は、データ分析において「生データを、分析しやすい形に整える」ために必須となる超重要テクニックです。プログラミングのif文を思い出しながら、ぜひ色々な条件でデータを切り分けてみてください。
次回は、いよいよSQL基礎編の最終回。データベースの構造そのものを便利に使い回す「VIEW」という概念について解説し、このシリーズの総まとめとしたいと思います。お楽しみに!
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!