データベースには膨大な情報が詰まっていて、それらをまとめて分析するときには、「どの年に発行された書籍がいくつあるのか」「ジャンルごとにレビュー数の最大値はどうなっているか」など、“グループごと”にまとめて集計したいシーンがよくあります。ここでは、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;
- Year でグループ化
- 同じ Year の書籍がひとまとまりになり、
COUNT(*)
で冊数を集計 - 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;
- Genre 別に分ける。
- 同じジャンルの中で Year が同じものをまとめる。
- 各グループの
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;
- GROUP BY Year で発行年ごとのグループを作る。
- それぞれのグループで MAX(Price) を計算。
- 計算結果が 50ドルより大きい グループだけを HAVING で抽出。
もしWHERE句で WHERE MAX(Price) > 50
と書いてもエラーになってしまいます。これはWHERE句では、まだグループ化後の集計結果を条件に指定できない からです。
まとめ
- GROUP BY句
- 同じ値を持つ行をまとめて、合計や平均、最大・最小などを算出。
- 複数カラムで細かいグループ分けも可能。
- HAVING句
- GROUP BYで集計した結果に対して、特定の条件でフィルタする。
- “集計後”の値(例:
SUM()
,MAX()
,AVG()
など)を基準に絞り込みたいときに使う。
- WHERE句
- グループ化する前の「元の行」に対して条件を指定するときに用いる。
- HAVINGは集計後、WHEREは集計前のフィルタリング、と覚えるとわかりやすい。
GROUP BYとHAVINGは、売上やレビューなどの集計レポートを作成する際に大活躍する機能です。データの塊を「いつ」「誰が」「どのジャンルで」など、いろいろな切り口でグループ分けし、結果を集計・フィルタして、より深い分析ができるようになります。
コメント