GROUP BYでグループ化

GROUP BYでグループ化 とは

GROUP BY句を使ってデータをグループ化する方法を学びます。集計処理の基本をマスター!。本レッスンでは、GROUP BYでグループ化 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

ここまで学んだ 集計関数 (COUNT, SUM, AVG...) は、テーブル全体を 1 行に集約するものでした。実務では「カテゴリごとの合計」「都道府県別の件数」「月別の売上」のように、グループ単位での集計が必要になります。それを実現するのが GROUP BY です。GROUP BY はビジネスレポート、ダッシュボード、KPI 計算など、データ分析の柱と言える機能で、SQL を学ぶうえで避けて通れません。

このレッスンでは GROUP BY の基本構文、複数列でのグループ化、SELECT 句のルール、ソートとの組み合わせを学びます。次のレッスンで扱う HAVING の前提知識でもあります。

基本構文

商品テーブルからカテゴリごとの件数と合計を出す例です。

SQL クエリ

SELECT category, COUNT(*) AS cnt, SUM(price) AS total_price FROM products GROUP BY category ORDER BY category;

GROUP BY category で「同じ category を持つ行」をまとめ、COUNTSUM で各グループの集計を出します。SELECT 句に書ける列は「GROUP BY に指定した列」または「集計関数の結果」だけ、というのが基本ルールです。

処理イメージ

GROUP BY の評価は次の流れです。

diagram (will load when visible)

つまり WHERE は「集計前の行絞り込み」、GROUP BY は「行をグループに束ねる」、集計関数は「グループ内を 1 行に圧縮する」、ORDER BY は「集計後の結果を並べる」という役割分担です。各句の順番を意識すると複雑なクエリでも迷わなくなります。

代表例 1 カテゴリ別の集計

商品テーブルから、カテゴリごとに「件数」「合計金額」「平均金額」「最高単価」を一括で出します。

SQL クエリ

SELECT category, COUNT(*) AS cnt, SUM(price) AS total, AVG(price) AS avg_price, MAX(price) AS max_price FROM products GROUP BY category ORDER BY total DESC;

このクエリは「カテゴリ別の売上ランキング」を一発で作るような使い方です。レポートでは ORDER BY を組み合わせて、上位グループから並べるのが定番です。

代表例 2 複数列でグループ化

GROUP BY には複数列を指定できます。たとえば「カテゴリ × ブランド」の組み合わせ別に件数を出す場合です。

SQL クエリ

SELECT category, brand, COUNT(*) AS cnt FROM products GROUP BY category, brand ORDER BY category, brand;

2 列の組み合わせが 1 つのグループになります。3 列以上の指定も同じ仕組みで動きます。

SELECT 句に書ける列は「GROUP BY に指定した列」と「集計関数の結果」だけ。それ以外の列を書くと、多くの DB でエラーまたは想定外の結果になります。

NULL のグループ化

GROUP BY は NULL を「1 つの値」として扱うので、NULL 値の行はまとめて 1 グループになります。DISTINCT と同じ挙動です。NULL を含む列でグループ化すると、結果に NULL 行が 1 つ含まれる点を覚えておきましょう。

よくある落とし穴

GROUP BY 句に書き忘れた列を SELECT に書いてしまい、エラーで気付くケースが多発します。SELECT に出したい非集計列は、必ず GROUP BY に追加する習慣を付けましょう。

もう一つの落とし穴は、WHEREHAVING の混同です。集計前の行に対するフィルタは WHERE、集計後のグループに対するフィルタは HAVING で書く、と分担しましょう (HAVING は次のレッスンで詳しく学びます)。

レポートで頻出するパターン

GROUP BY はビジネスレポートで「カテゴリ別売上」「店舗別注文数」「曜日別アクセス数」など、まさに分析の核となる場面で大活躍します。CSV エクスポートや BI ツール連携の元データは、ほとんどが GROUP BY を含む SQL で作られているといっても過言ではありません。WHERE で範囲を絞ってから GROUP BY を使うと、データ量に対してずっと効率的になる点も覚えておきましょう。

まとめ

  • GROUP BY で行をグループに束ね、各グループを集計関数で 1 行に圧縮する
  • SELECT 句には「GROUP BY 列」と「集計関数」しか書けない
  • 複数列を GROUP BY すると「列の組み合わせ」がキーになる
  • NULL は 1 つのグループとして扱われる
  • 評価順は FROM → WHERE → GROUP BY → 集計 → SELECT → ORDER BY
  • BI ツール連携やレポート SQL の主役機能であり、データ分析の柱
  • グループごとの件数だけ見たいときは COUNT(*)、合計や平均が必要なときは SUM AVG を使い分ける

次のレッスン

次は HAVINGでグループ条件 です。HAVING句を使ってグループ化されたデータに条件を指定する方法を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. GROUP BY の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. GROUP BY とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

テーブル構造

schema.sql

CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, category VARCHAR(30) NOT NULL, price INT NOT NULL ); INSERT INTO products (id, name, category, price) VALUES (1, 'ノートPC', '家電', 128000), (2, 'マウス', '家電', 2980), (3, 'キーボード', '家電', 6800), (4, '小説A', '書籍', 1800), (5, '小説B', '書籍', 2200), (6, '専門書A', '書籍', 4500), (7, 'コーヒー豆', '食品', 1500), (8, '紅茶葉', '食品', 1200);

期待される出力

categorycnttotal
家電3137780
書籍38500
食品22700

ヒント

query.sql
query.sql
学習モード
コードの実行結果
データベースを初期化中...