データベース管理や分析の際、データをグループ化して集計する方法を知ることは非常に重要です。
本記事では、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以上の部門を抽出してください。
EmployeeID | Department | Salary |
---|---|---|
1 | Sales | 40000 |
2 | Sales | 60000 |
3 | HR | 50000 |
4 | HR | 55000 |
5 | IT | 45000 |
問題2: 件数をカウントする
以下のOrdersテーブルを基に、各顧客(CustomerID)ごとの注文数(OrderCount)を計算し、注文数が3以上の顧客を抽出してください。
OrderID | CustomerID | Amount |
---|---|---|
101 | C001 | 200 |
102 | C002 | 150 |
103 | C001 | 300 |
104 | C003 | 400 |
105 | C001 | 250 |
106 | C002 | 100 |
解答例
問題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のグループ化の仕組みを理解し、実際の業務で活用してみてください。