SQL問題 性年代別の人数を集計する

問題:nyumon2_ customer2で性年代別のレコード数を集計。ただし集計は以下の方法で行うこと。

  • 集計は「男性_30代」のように「性別+’_’+年代」と人数の2列を結果として、性年代で並び替える
  • 年齢は10歳刻み、ただし20歳未満と60歳以上は「範囲外」、NULLは「不明」とすること
  • 性別は「男性」「女性」それ以外は「不明」とすること
  • 削除済み会員は除外

利用テーブルはnyumon2_customer2 。 使い方はSQL学習用サンプルデータを参照。

性別と年代をそれぞれ作って結合し、集計キーに使う

解答: 不明_範囲外、女性_20代、女性_30代、女性_不明、男性_20代、男性_30代、男性_40代が各1人、男性_範囲外が3人。昇順ならこの並び順になる(降順なら男性_範囲外が最初)。

解説:SQLだけ最初に見てしまうとややこしく見えるが、
 ・年齢と性別は指定通りにそれぞれ作る
 ・アンダーバーも併せてCONCATで結合する
 ・その結果を使って集計する
 ・削除済みはWHEREで除外する
 ・最後にORDER BYでを追加する
と手順を踏んでいけば正解にたどり着けるはずだ。

なお、年齢のCASE文ではELSEに「範囲外」を使うとNULLと区別できなくなるので注意。

SELECT
CONCAT(
CASE WHEN sex=1 THEN '男性’
WHEN sex=2 then '女性’
ELSE '不明’ END
, '_’
, CASE WHEN age < 20 THEN '範囲外’
WHEN age < 30 THEN ’20代’
WHEN age < 40 THEN ’30代’
WHEN age < 50 THEN ’40代’
WHEN age < 60 THEN ’50代’
WHEN age IS NOT NULL THEN '範囲外’
ELSE '不明’ END
) sex_age
,count(id)
FROM `nyumon2_customer2`
WHERE is_deleted IS FALSE
GROUP BY sex_age
ORDER BY sex_age

SQL問題一覧はこちら

2020年1月14日SQL問題

Posted by shinu