SQLのGROUP BYは、データをまとめて集計するための機能です。
こんなときに使います
- 各部署の人数を知りたい
- 商品ごとの売上合計を出したい
- 月別の売上を調べたい
- 地域ごとの平均値を求めたい
GROUP BYを使えば、同じ種類のデータをまとめて計算できるようになります。
基本的な使い方

最もシンプルな形
説明 GROUP BYの基本的な書き方です。
基本の書き方
SELECT まとめたい列, 集計関数
FROM テーブル名
GROUP BY まとめたい列;
具体例:部署ごとの人数を数える
例
SELECT department, COUNT(*) AS 人数
FROM employees
GROUP BY department;
実行結果(例)
department | 人数
-----------|----
営業部 | 15
技術部 | 12
総務部 | 8
説明
department
:部署名でグループ化COUNT(*)
:各グループの行数を数えるAS 人数
:結果の列に「人数」という名前をつける
よく使う集計関数
集計関数一覧
関数 | 何をする? | 使う場面 |
---|---|---|
COUNT(*) | 行数を数える | 人数、件数を知りたい |
SUM() | 合計を計算 | 売上合計、点数合計 |
AVG() | 平均を計算 | 平均年齢、平均点 |
MAX() | 最大値を見つける | 最高点、最高売上 |
MIN() | 最小値を見つける | 最低点、最低価格 |
集計関数の使用例
例1:部署ごとの平均年齢
SELECT department, AVG(age) AS 平均年齢
FROM employees
GROUP BY department;
実行結果(例)
department | 平均年齢
-----------|--------
営業部 | 32.5
技術部 | 28.7
総務部 | 35.2
例2:商品ごとの売上合計
SELECT product_name, SUM(sales) AS 売上合計
FROM orders
GROUP BY product_name;
実行結果(例)
product_name | 売上合計
-------------|--------
ノートPC | 1500000
マウス | 250000
キーボード | 180000
結果を並び替える:GROUP BY + ORDER BY
売上の多い順に並べる
説明 集計した結果を並び替えたいときは、ORDER BYを組み合わせます。
例
SELECT product_name, SUM(sales) AS 売上合計
FROM orders
GROUP BY product_name
ORDER BY 売上合計 DESC;
実行結果(例)
product_name | 売上合計
-------------|--------
ノートPC | 1500000
マウス | 250000
キーボード | 180000
ポイント
DESC
:大きい順(降順)ASC
:小さい順(昇順)※省略可能
複数の列でグループ化

年月別の売上を調べる
説明 複数の条件でグループ化したいときは、カンマで区切ります。
例
SELECT year, month, SUM(sales) AS 月間売上
FROM orders
GROUP BY year, month
ORDER BY year, month;
実行結果(例)
year | month | 月間売上
-----|-------|--------
2024 | 1 | 500000
2024 | 2 | 600000
2024 | 3 | 550000
部署と職位別の人数
例
SELECT department, position, COUNT(*) AS 人数
FROM employees
GROUP BY department, position
ORDER BY department, position;
実行結果(例)
department | position | 人数
-----------|----------|----
営業部 | 主任 | 3
営業部 | 課長 | 2
営業部 | 部長 | 1
技術部 | 主任 | 4
技術部 | 課長 | 1
条件を付ける:WHEREとHAVING
WHEREとHAVINGの違い
句 | いつ使う? | 何に条件をつける? |
---|---|---|
WHERE | 集計する前 | 元のデータ |
HAVING | 集計した後 | 集計結果 |
WHERE:集計前にデータを絞る
例:2024年のデータだけで部署別人数
SELECT department, COUNT(*) AS 人数
FROM employees
WHERE hire_date >= '2024-01-01'
GROUP BY department;
HAVING:集計後に結果を絞る
例:平均年齢が30歳以上の部署だけ表示
SELECT department, AVG(age) AS 平均年齢
FROM employees
GROUP BY department
HAVING AVG(age) >= 30;
実行結果(例)
department | 平均年齢
-----------|--------
営業部 | 32.5
総務部 | 35.2
WHEREとHAVINGを組み合わせる
例:2024年入社で、部署の人数が5人以上
SELECT department, COUNT(*) AS 人数
FROM employees
WHERE hire_date >= '2024-01-01'
GROUP BY department
HAVING COUNT(*) >= 5;
NULLを含むデータの扱い
NULLはどうなる?
説明 NULLがある列でGROUP BYすると、NULLも一つのグループとして扱われます。
例
SELECT category, COUNT(*) AS 商品数
FROM products
GROUP BY category;
実行結果(例)
category | 商品数
---------|------
家電 | 15
文具 | 8
NULL | 3
対策:NULLを除外したい場合
SELECT category, COUNT(*) AS 商品数
FROM products
WHERE category IS NOT NULL
GROUP BY category;
実際に使える例

売上分析レポート
例:月別売上と前月比
SELECT
year,
month,
SUM(sales) AS 月間売上,
COUNT(*) AS 注文件数,
AVG(sales) AS 平均注文額
FROM orders
WHERE year = 2024
GROUP BY year, month
ORDER BY month;
顧客分析
例:地域別の顧客動向
SELECT
region,
COUNT(*) AS 顧客数,
AVG(age) AS 平均年齢,
SUM(total_purchase) AS 地域売上
FROM customers
GROUP BY region
HAVING COUNT(*) >= 10
ORDER BY 地域売上 DESC;
商品分析
例:カテゴリ別の商品統計
SELECT
category,
COUNT(*) AS 商品数,
AVG(price) AS 平均価格,
MAX(price) AS 最高価格,
MIN(price) AS 最低価格
FROM products
WHERE price > 0
GROUP BY category
ORDER BY 平均価格 DESC;
よくある間違いと注意点
SELECT句に集計対象外の列を入れる
間違った例
-- これはエラーになる
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;
正しい例
-- 集計に使う列か集計関数のみ
SELECT department, COUNT(*)
FROM employees
GROUP BY department;
WHEREで集計関数を使う
間違った例
-- これはエラーになる
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;
正しい例
-- 集計後の条件はHAVINGを使う
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;
ORDER BYで列の指定を間違える
注意点 ORDER BYでは、SELECT句にある列名や集計関数を使います。
正しい例
SELECT department, COUNT(*) AS 人数
FROM employees
GROUP BY department
ORDER BY 人数 DESC; -- または COUNT(*) DESC
SQLの実行順序
重要 SQLは書いた順番ではなく、決まった順序で実行されます。
FROM
– テーブルを指定WHERE
– データを絞り込みGROUP BY
– グループ化HAVING
– 集計結果を絞り込みSELECT
– 列を選択ORDER BY
– 並び替え
この順序を理解すると、エラーが起きる理由がわかります。
まとめ
GROUP BYの基本パターン
やりたいこと | SQL例 |
---|---|
基本の集計 | GROUP BY department |
結果を並び替え | GROUP BY department ORDER BY COUNT(*) DESC |
集計後に条件 | GROUP BY department HAVING COUNT(*) > 5 |
複数列でグループ化 | GROUP BY year, month |
集計前にデータを絞る | WHERE year = 2024 GROUP BY department |
覚えておくべきポイント
基本ルール
- SELECT句には、GROUP BY句の列か集計関数のみ
- 集計前の条件はWHERE、集計後の条件はHAVING
- NULLも一つのグループとして扱われる
よく使う集計関数
COUNT(*)
:件数SUM()
:合計AVG()
:平均MAX()
,MIN()
:最大・最小
組み合わせパターン
- GROUP BY + ORDER BY:並び替え
- GROUP BY + HAVING:条件付き集計
- WHERE + GROUP BY + HAVING:完全な分析
コメント