【初心者向け】SQLのGROUP BY完全ガイド

データベース・SQL

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は書いた順番ではなく、決まった順序で実行されます。

  1. FROM – テーブルを指定
  2. WHERE – データを絞り込み
  3. GROUP BY – グループ化
  4. HAVING – 集計結果を絞り込み
  5. SELECT – 列を選択
  6. 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:完全な分析

コメント

タイトルとURLをコピーしました