【SQL基礎】世代ごとに人数を表示する


はじめに

今回はMySQLで世代ごとの人数を表示する方法についてまとめます。

(参考)データ分析スキルチェック

カテゴリ プログラミング
レベル ★☆☆ 
チェック項目 SQLで簡単なSELECT文を記述・実行できる
(副問合せを含まない、2テーブル程度の結合と簡単なWHERE条件を含むSELECT文)

使うデータ

今回は以下のデータで練習します。

name age
二宮 22
松本 24
中居 22
木村 32
香取 29
櫻井 22
岡田 25
長瀬 23
三宅 36
森田 35
大野 40
草薙 44
稲垣 33

GROUP BYを使ってみる

まずGROUP BYでそれぞれの年齢の人数を見てみましょう。20代が多めですね。

SELECT
    age AS 年齢, 
    COUNT(*) AS 人数
FROM
    table_name 
GROUP BY age;

Whereで条件を絞る

以下のようにWHEREを組み合わせます。
この方法だと'age'列で、10, 20, 30, 40歳ピッタリのデータを検索しカウントしてくれます。

SELECT
    age AS 年齢, 
    COUNT(*) AS 人数
FROM
    table_name 
WHERE
    age = 10 OR age = 20 OR age = 30 OR age = 40 OR age = 50
GROUP BY age;

DIVを使い、グルーピングを行う

'age'列の数値をDIVを使い10で割って切り捨てしてからグループ化することで、
それぞれのグループのデータ数をカウントを行います。
例えば、20~29の数値はすべて2になるので同一グループとしてみなされます。

SELECT
    age AS 年代,
    COUNT(*) AS 人数
FROM
    table_name 
GROUP BY
    age DIV 10;

グループごとの一番低い数値がセルにはいるので、このままではデータ量が少ないときは注意が必要です。例えば20代でも一番低い数字が23な場合は、23が表示されてしまいます。

CONCAT関数を使ってインデックスを生成

そんなときはCONCAT関数を使ってインデックスとなる列をつくりましょう。

SELECT
    CONCAT( (age DIV 10) * 10, "代") AS 年代,
    COUNT(*) AS 人数
FROM
    table_name 
GROUP BY
    age DIV 10

参考 http://uyamazak.hatenablog.com/entry/2017/08/18/144725

CASE文でより柔軟に数値の範囲指定を

18歳以下など、範囲の指定が柔軟に必要な場合は、以下のようなやり方が必要です。
他にもっといいやり方があったら教えてください!

SELECT
    CASE
        WHEN age <18 THEN 'Under 18' 
        WHEN age between 18 AND 24 THEN '18-24' 
        WHEN age between 25 AND 34 THEN '25-34'
        WHEN age between 35 AND 44 THEN '35-44'
    END AS 年代,
    Count(*) AS 人数
FROM
    table_name 
GROUP BY 年代;

参考 https://teratail.com/questions/51772