GROUP BY でグループごとに集計する
GROUP BY を使うと、特定のカラムの値ごとにデータをグループ化して集計できます。「都市ごとのユーザー数」「月ごとの売上」のような集計に使います。
基本構文
SELECT カラム名, 集計関数 FROM テーブル名 GROUP BY カラム名;具体例
users テーブルで、都市ごとのユーザー数を調べるには、こう書きます。
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city;結果は次のようになります。
| city | user_count |
|---|---|
| 東京 | 45 |
| 大阪 | 30 |
| 名古屋 | 15 |
GROUP BY の動き
GROUP BY は次のように動きます。
テーブル全体を取得
指定したカラムの値でグループに分ける
各グループに対して集計関数を適用
複数のカラムでグループ化
複数のカラムを指定すると、その組み合わせでグループ化されます。
SELECT city, gender, COUNT(*) AS user_count
FROM users
GROUP BY city, gender;| city | gender | user_count |
|---|---|---|
| 東京 | male | 25 |
| 東京 | female | 20 |
| 大阪 | male | 18 |
| 大阪 | female | 12 |
SELECT で使えるカラム
GROUP BY を使うと、SELECT で指定できるカラムに制限があります。
使える
GROUP BY で指定したカラム、集計関数
使えない
GROUP BY で指定していない通常のカラム
-- 正しい
SELECT city, COUNT(*) FROM users GROUP BY city;
-- エラー(name は GROUP BY にも集計関数にもない)
SELECT city, name, COUNT(*) FROM users GROUP BY city;グループ化すると、各グループから 1 行しか返らないので、どの name を返せばよいか決まらないからです。
集計関数と一緒に使う
GROUP BY は集計関数と組み合わせて使うのが基本です。
-- 都市ごとの平均年齢
SELECT city, AVG(age) AS avg_age FROM users GROUP BY city;
-- 部署ごとの合計給与
SELECT department_id, SUM(salary) AS total_salary
FROM employees GROUP BY department_id;ORDER BY で並び替える
集計結果を並び替えることもできます。
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
ORDER BY user_count DESC;ユーザーが多い都市から順に並びます。
GROUP BY でグループごとの集計ができるようになると、データ分析の幅が大きく広がります。次は HAVING を使って、集計結果をさらに絞り込む方法を見てみましょう。











