【SQL】ユーザの生年月日から年代別ユーザ数分布表を作る
こんにちは。データ好きマーケターのmycotです。
日々の業務にSQLやmetabaseを活用中です。
登録ユーザの年齢層の分布をいつでも閲覧できたらいいな、と思い、今回は年代別ユーザ数をダッシュボードに加えることにしました。
テーブル
ユーザの基本情報を格納したUsersテーブルにbirthdayという項目があり、ユーザの生年月日が保存されています。
クエリを書く
CASEを使って年代別に分岐させ、COUNTで集計します。
TIMESTAMPDIFF()関数:引数は、結果の単位(ここではYEAR)と差を求める 2 つの日付(`birthday`と今日の日付)。
CURDATE()関数:今日の日付を取得する関数。stringだとYYYY-MM-DD、numericだとYYYYMMDD。Numericの場合はcurdate()+0と書く。
SELECT
CASE
WHEN TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) < 20 THEN '1. Under 20'
WHEN TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) <= 29 THEN '2. 20-29'
WHEN TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) <= 39 THEN '3. 30-39'
WHEN TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) <= 49 THEN '4. 40-49'
WHEN TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) <= 59 THEN '5. 50-59'
WHEN TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) <= 69 THEN '6. 60-69'
WHEN TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) >= 70 THEN '7. Over 70'
ELSE 'unknown'
END as age_group
,count(1)
FROM users
GROUP BY 1
ORDER BY 1
完成です。年代別の度数分布表が完成しました。
COUNT(1)は人数など命名してあげるとより親切かもしれません。
・・・あれ?本当は20歳未満は登録されていないはずなのだが、複数名発見。よくみてみるとだいぶ昔に登録されたデータで、入力ミスっぽい。修正しておこっと。