【一気にプロ感UP】GROUP BY&HAVINGでサクッと“まとめて”&“絞る”SQL術

PR表記

※アフィリエイト広告を利用しています

データベースには膨大な情報が詰まっていて、それらをまとめて分析するときには、「どの年に発行された書籍がいくつあるのか」「ジャンルごとにレビュー数の最大値はどうなっているか」など、“グループごと”にまとめて集計したいシーンがよくあります。ここでは、SQLのGROUP BY句とHAVING句を使って「グループごとの集計」や「集計結果への条件指定」を行う方法をやさしく解説していきます。

目次

GROUP BY句とは?

グループ化のイメージ

  • GROUP BY句 は、同じ値を持つ行をひとまとめ(グループ)にして集計するために使います。
  • たとえば「発行年が同じ本をグループにして、書籍数を数える」あるいは「顧客IDが同じ注文をまとめて、合計金額を出す」といった処理が可能です。

基本構文

SELECT グループ化したい列, 集計関数(列)
FROM テーブル名
GROUP BY グループ化したい列;
  • 「グループ化したい列」で行をまとめ、「集計関数」を使って合計、平均、件数などを算出します。
  • よく使われる集計関数には、COUNT(*), SUM(列), AVG(列), MAX(列), MIN(列) などがあります。

GROUP BYの実践例

例1:発行年ごとに書籍数を数える

  • booksテーブルにおいて、Year 列でグループを作り、それぞれのグループの冊数を取得します。
SELECT Year, COUNT(*)
FROM books
GROUP BY Year;
  1. Year でグループ化
  2. 同じ Year の書籍がひとまとまりになり、 COUNT(*) で冊数を集計
  3. AS句を使わなくてもクエリは機能します(「書籍数」という列名に変えたい場合は AS を使う場合があります)

例2:発行年ごとに書籍の平均価格を算出

  • 今度は Year 列でグループ化しつつ、各年の Price(価格)の平均を調べたいときに、AVG() 関数を使います。
SELECT Year, AVG(Price)
FROM books
GROUP BY Year;
  • これで、「各発行年に出版された本の平均価格」が一覧でわかるようになります。

複数カラムによるグループ化

なぜ複数カラムが必要?

  • たとえば「ジャンルごと」かつ「発行年ごと」にグループを作りたい場合、一つのカラムだけでは足りません。複数条件を設定して、より細かくグループ分けができるようになります。

基本構文

SELECT カラムA, カラムB, 集計関数(列)
FROM テーブル名
GROUP BY カラムA, カラムB;
  • 左から順番に、まずカラムAでグループ分けし、さらに同じAの中でカラムBも同じものをまとめます。

例:ジャンル × 発行年 でグループ化してレビュー数の最大値を取得

SELECT Genre, Year, MAX(Reviews)
FROM books
GROUP BY Genre, Year;
  1. Genre 別に分ける。
  2. 同じジャンルの中で Year が同じものをまとめる。
  3. 各グループの Reviews の最大値を求める。

これで「ジャンルと発行年が同じ本の中で、一番レビュー数が多いのは何冊分だったか?」をチェックできます。

HAVING句とは?

WHERE句と何が違うの?

  • WHERE句 は「テーブルから行を絞り込む(まだ集計していない段階)」ときに使うのに対し、
  • HAVING句 は「GROUP BY で集計した結果に対して、さらにフィルタリングする」ために使います。

基本構文

SELECT グループ化したい列, 集計関数(列)
FROM テーブル名
GROUP BY グループ化したい列
HAVING 集計関数(列) 条件;

例:発行年ごとに最大価格を求めつつ、その最大価格が50ドルより大きい年だけを表示

SELECT Year, MAX(Price)
FROM books
GROUP BY Year
HAVING MAX(Price) > 50;
  1. GROUP BY Year で発行年ごとのグループを作る。
  2. それぞれのグループで MAX(Price) を計算。
  3. 計算結果が 50ドルより大きい グループだけを HAVING で抽出。

もしWHERE句で WHERE MAX(Price) > 50 と書いてもエラーになってしまいます。これはWHERE句では、まだグループ化後の集計結果を条件に指定できない からです。

まとめ

  1. GROUP BY句
    • 同じ値を持つ行をまとめて、合計や平均、最大・最小などを算出。
    • 複数カラムで細かいグループ分けも可能。
  2. HAVING句
    • GROUP BYで集計した結果に対して、特定の条件でフィルタする。
    • “集計後”の値(例:SUM(), MAX(), AVG() など)を基準に絞り込みたいときに使う。
  3. WHERE句
    • グループ化する前の「元の行」に対して条件を指定するときに用いる。
    • HAVINGは集計後、WHEREは集計前のフィルタリング、と覚えるとわかりやすい。

GROUP BYとHAVINGは、売上やレビューなどの集計レポートを作成する際に大活躍する機能です。データの塊を「いつ」「誰が」「どのジャンルで」など、いろいろな切り口でグループ分けし、結果を集計・フィルタして、より深い分析ができるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次