【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 年代;
Author And Source
この問題について(【SQL基礎】世代ごとに人数を表示する), 我々は、より多くの情報をここで見つけました https://qiita.com/sai-san/items/8901468713cfe28adfe2著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .