SQLでデータを集計する際、「GROUP BY」を使ってグループごとの件数をカウントすることはよくあります。さらに、集計した件数に条件をつけて絞り込む方法を理解しておくことで、より実用的なクエリを作成できます。
この記事では、GROUP BYによる件数のカウント方法と、HAVING句を使った条件付きの絞り込み方法を紹介します。
基本 GROUP BYで件数をカウントする
まずは、テーブル内のデータをグループ化して、各グループの件数を数える基本構文です。
例:ユーザーごとの投稿数をカウントする
SELECT user_id, COUNT(*) AS post_count
FROM posts
GROUP BY user_id;
このクエリでは、postsテーブルをuser_idでグループ化し、それぞれのユーザーが投稿した件数をカウントしています。
応用 件数に条件をつけて絞り込む(HAVING句)
WHERE句は個別のレコードに対する条件ですが、GROUP BYでグループ化したあとの集計結果に対して条件をつけたい場合は、HAVING句を使います。
例:投稿数が3件以上のユーザーのみ表示する
SELECT user_id, COUNT(*) AS post_count
FROM posts
GROUP BY user_id
HAVING COUNT(*) >= 3;
このクエリでは、user_idごとの投稿数が3件以上のユーザーだけを抽出しています。
条件付きカウント WHEREと組み合わせる
集計前にレコードに条件を付けたい場合は、WHERE句を使います。HAVINGとの使い分けが重要です。
例:2025年の投稿だけを集計対象にする
SELECT user_id, COUNT(*) AS post_count
FROM posts
WHERE post_date BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY user_id
HAVING COUNT(*) >= 5;
この例では、2025年中の投稿に絞ってから、投稿数が5件以上のユーザーを抽出しています。
別の応用 カテゴリごとの商品数が多い順に並べる
SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category
HAVING COUNT(*) > 10
ORDER BY product_count DESC;
このクエリでは、商品数が10件を超えるカテゴリのみを対象とし、件数が多い順に並べて表示します。
まとめ
- GROUP BYはレコードを特定のカラムでまとめて集計するために使う。
- 集計結果に条件を付けたいときはHAVING句を使う。
- 個々のレコードに対する条件はWHERE句で指定する。
データ分析やレポート作成の場面で非常に役立つテクニックなので、ぜひ活用してみてください。