SQLのCASE式を上手く使うと集計がちょっと楽になる話
私の本業はマーケターや事業開発(=非エンジニア)でありつつ、業務でSQLを使い、データ抽出、集計、分析を行うことがあります。SQLは、最初は社内のエンジニアに教えてもらい、その後独学で習得していきました。
SQLの学習を進める中で、「CASE式」が非常に便利だなと感じていたので、そのtipsについて記載します。
この記事の対象者は、SQLの初学者や初心者で、クエリ例などはMySQLで記載します。
CASE式の基本的な構文
まず、CASE式の基本的な構文を、簡単な例を踏まえて説明します。(ご存知の方も多いと思いますが一応)。
↓元のTABLE例として、こんな会員データがあったとします。
↓ここから、性別(Sex)をCASE式で"男", "女"に変換してみましょう。他の列はいじらず、性別(Sex)の'1', '2'のみを"男", "女"に変換します。
SELECT
Id,
CASE Sex
WHEN 1 THEN '男'
WHEN 2 THEN '女'
ELSE 'その他' END AS Sex,
Age,
Prefectures
FROM <テーブル名>
↓抽出結果です。無事変換されました。
このようにCASE式はラベルを読み替えてくれます。とてもシンプルですね。
CASE式は集計する時に便利
データの抽出や集計業務をやっていて、CASE式の便利な使い方が3つあるので、説明していきます。
【1】既存のラベルを新しいラベルに変換して集計する
データとして格納されている時のラベルを、分析用に新しいラベルに変換して集計したいことってありませんか?例えば先ほどの例だと、「都道府県単位」の会員データを「地方単位」で集計する、などです。
↓元のTABLE(都道府県単位の会員データ)
↓このようなクエリで、都道府県を地方に変換し、ユーザーの数をカウントします(ちょっと長いですが…)。
SELECT
CASE Prefectures
WHEN '北海道' THEN '北海道'
WHEN '青森' THEN '東北'
WHEN '岩手' THEN '東北'
WHEN '宮城' THEN '東北'
WHEN '秋田' THEN '東北'
WHEN '山形' THEN '東北'
WHEN '福島' THEN '東北'
WHEN '東京' THEN '関東'
WHEN '茨城' THEN '関東'
WHEN '栃木' THEN '関東'
WHEN '群馬' THEN '関東'
WHEN '埼玉' THEN '関東'
WHEN '千葉' THEN '関東'
WHEN '神奈川' THEN '関東'
WHEN '新潟' THEN '中部'
WHEN '富山' THEN '中部'
WHEN '石川' THEN '中部'
WHEN '福井' THEN '中部'
WHEN '山梨' THEN '中部'
WHEN '長野' THEN '中部'
WHEN '岐阜' THEN '中部'
WHEN '静岡' THEN '中部'
WHEN '愛知' THEN '中部'
WHEN '京都' THEN '近畿'
WHEN '大阪' THEN '近畿'
WHEN '三重' THEN '近畿'
WHEN '兵庫' THEN '近畿'
WHEN '滋賀' THEN '近畿'
WHEN '奈良' THEN '近畿'
WHEN '和歌山' THEN '近畿'
WHEN '鳥取' THEN '中国'
WHEN '島根' THEN '中国'
WHEN '岡山' THEN '中国'
WHEN '広島' THEN '中国'
WHEN '山口' THEN '中国'
WHEN '徳島' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '愛媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福岡' THEN '九州'
WHEN '佐賀' THEN '九州'
WHEN '長崎' THEN '九州'
WHEN '大分' THEN '九州'
WHEN '熊本' THEN '九州'
WHEN '宮崎' THEN '九州'
WHEN '鹿児島' THEN '九州'
WHEN '沖縄' THEN '九州'
ELSE 'その他' END AS Region,
COUNT(Id) AS Users
FROM <テーブル名>
GROUP BY Region
ORDER BY Users DESC
CASE式で都道府県を地方名に変換し、地方ごとにCOUNTしています(GROUP BY を忘れずに)。また、「ORDER BY」で、人数が多い順に並べています。
↓抽出結果
無事、集計完了しました。このように、既存のラベルを新しいラベルに変換して集計する際にCASE式が便利です。
【2】数値を階級に分けて集計する
【1】と同じように、数値を階級に分けて集計したい場合もCASE式は便利です。同じデータを使い、年齢(Age)を年代に分けて、年代別のユーザー数をカウントしてみましょう。
↓元のTABLE
↓年齢(Age)を年代に分けてユーザー数をカウントするクエリ
SELECT
CASE
WHEN Age < 20 THEN '10代以下'
WHEN Age >= 20 AND Age < 30 THEN '20代'
WHEN Age >= 30 AND Age < 40 THEN '30代'
WHEN Age >= 40 AND Age < 50 THEN '40代'
WHEN Age >= 50 AND Age < 60 THEN '50代'
WHEN Age >= 60 AND Age < 70 THEN '60代'
WHEN Age >= 70 THEN '70代以上'
ELSE 'その他' END AS AgeClass,
COUNT(Id) AS Users
FROM <テーブル名>
GROUP BY AgeClass
ORDER BY Users DESC
↓抽出結果
このように、CASE式は数値を階級に分けて集計したい場合も簡単な記述でそれが実現できます。
【3】2つ以上の条件の集計を1つのSQLで行う
2つ以上の条件で集計を行いたいというケースはよく発生するかと思います。例えば先ほどと同じデータだと、「都道府県別に、男性・女性のユーザー数をカウントして、それぞれ列に結果を表示させたい」というようなものです。いわば、クロス集計表と同じですね。
WITH句を使って中間テーブルを作成し、JOINして作成する方法もありますが、CASE式であればシンプルにできます。
↓元のTABLE
↓CASE式をこのように使います。
SELECT
Prefectures,
COUNT(CASE WHEN Sex = 1 THEN Id ELSE Null END) AS Users_m,
COUNT(CASE WHEN Sex = 2 THEN Id ELSE Null END) AS Users_f
FROM <テーブル名>
GROUP BY Prefectures
↓抽出結果です。無事、都道府県別の男性・女性の人数がカウントできました。
このように、CASE式を上手く使うと集計が楽になります。
SQLを学習中の方はぜひ参考にしてみてください。
以上です。
最後までお読み頂きありがとうございました。
------------------------------------
よかったらtwitterのフォローもどうぞ。
https://twitter.com/MasayukiAbe7
------------------------------------