見出し画像

【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歳未満は登録されていないはずなのだが、複数名発見。よくみてみるとだいぶ昔に登録されたデータで、入力ミスっぽい。修正しておこっと。


いいなと思ったら応援しよう!