【SQL】GROUP BYで件数をカウント&条件付きで絞り込む方法

【SQL】GROUP BYで件数をカウント&条件付きで絞り込む方法 SQL

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句で指定する。

データ分析やレポート作成の場面で非常に役立つテクニックなので、ぜひ活用してみてください。