SQL Serverのグループ化を完全解説:GROUP BYとHAVING句の使い方、WHERE句との違い

データベース管理や分析の際、データをグループ化して集計する方法を知ることは非常に重要です。

本記事では、SQL ServerにおけるGROUP BY句とHAVING句の基本的な使い方を解説します。また、WHERE句との違いや注意点についても詳しく説明します。

最後に、理解を深めるための演習問題とその解答例も用意しています。


GROUP BY句とは?

GROUP BY句は、テーブルの行を特定の列の値ごとにグループ化するために使用します。このグループ化により、各グループに対して集計関数(例:SUM、AVG、COUNTなど)を適用できます。

基本構文

SELECT 列名1, 集計関数(列名2)
FROM テーブル名
GROUP BY 列名1;

使用例

以下は、売上テーブル(Sales)をグループ化し、各商品の合計売上を計算する例です。

SELECT ProductID, SUM(Amount) AS TotalAmount
FROM Sales
GROUP BY ProductID;

ProductIDごとに行をグループ化し、それぞれのAmount(売上額)を合計しています。


HAVING句とは?

HAVING句は、グループ化後の結果に条件を適用するために使用します。WHERE句と似ていますが、HAVINGは集計関数を条件に含めることが可能です。

基本構文

SELECT 列名1, 集計関数(列名2)
FROM テーブル名
GROUP BY 列名1
HAVING 集計関数(列名2) 条件式;

使用例

先ほどの例に条件を追加し、売上合計が1000以上の商品を抽出します。

SELECT ProductID, SUM(Amount) AS TotalAmount
FROM Sales
GROUP BY ProductID
HAVING SUM(Amount) >= 1000;

HAVING句により、集計結果(SUM(Amount))が1000以上のグループだけが結果に含まれます。


WHERE句との違い

特徴WHERE句HAVING句
適用タイミングデータのフィルタリングはグループ化のグループ化の
使用可能な条件式単純な条件式、列値、リテラル集計関数やグループ化されたデータの条件式
併用例GROUP BY句の前に指定GROUP BY句の後に指定

使用例の比較

次の例は、同じデータセットに対してWHERE句とHAVING句の使い方を比較しています。

-- WHERE句を使用した例
SELECT ProductID, Amount
FROM Sales
WHERE Amount > 100;

-- HAVING句を使用した例
SELECT ProductID, SUM(Amount) AS TotalAmount
FROM Sales
GROUP BY ProductID
HAVING SUM(Amount) > 100;
  • WHERE句は、行レベルでAmount > 100の条件をフィルタリングします。
  • HAVING句は、グループ化後の合計売上(SUM(Amount))が100を超えるグループを選択します。

演習問題

以下の問題を解いて、GROUP BY句とHAVING句の使い方を確認しましょう。

問題1: グループごとの平均値を求める

以下のEmployeesテーブルから、部門(Department)ごとの平均給与(Salary)を計算し、平均給与が50,000以上の部門を抽出してください。

EmployeeIDDepartmentSalary
1Sales40000
2Sales60000
3HR50000
4HR55000
5IT45000

問題2: 件数をカウントする

以下のOrdersテーブルを基に、各顧客(CustomerID)ごとの注文数(OrderCount)を計算し、注文数が3以上の顧客を抽出してください。

OrderIDCustomerIDAmount
101C001200
102C002150
103C001300
104C003400
105C001250
106C002100

解答例

問題1の解答

SELECT Department, AVG(Salary) AS AvgSalary
FROM Employees
GROUP BY Department
HAVING AVG(Salary) >= 50000;

結果: Department AvgSalary Sales 50000 HR 52500

問題2の解答

SELECT CustomerID, COUNT(OrderID) AS OrderCount
FROM Orders
GROUP BY CustomerID
HAVING COUNT(OrderID) >= 3;

結果: CustomerID OrderCount C001 3


まとめ

  • GROUP BY句は、行をグループ化し、各グループに対して集計を行うために使用します。
  • HAVING句は、グループ化後のデータに条件を適用する際に使います。
  • WHERE句は、グループ化前のデータに対して条件を適用します。

これらを組み合わせることで、複雑なデータ集計や条件付きの分析を行えるようになります。本記事を通じてSQL Serverのグループ化の仕組みを理解し、実際の業務で活用してみてください。