SQL Serverの集計クエリでよくある疑問を徹底解消!WHERE句、GROUP BY句、HAVING句の使い方に関するQ&A
SQL Serverにおける WHERE句, GROUP BY句, HAVING句 の実行順序
実行順序
以下の順序で実行されます。
- WHERE句: 条件に合致するレコードのみを抽出します。
- GROUP BY句: 指定された列に基づいてデータをグループ化します。
- HAVING句: グループ化されたデータに対して条件を指定し、抽出するグループを絞り込みます。
詳細解説
WHERE句:
- 他の句の影響を受けません。
GROUP BY句:
- WHERE句で抽出されたレコードに対して実行されます。
- 指定された列に基づいてデータをグループ化し、各グループの集計値を算出します。
- 例:
SELECT Country, COUNT(*) AS CustomerCount FROM Customers GROUP BY Country;
このクエリは、各国の顧客数を集計します。
HAVING句:
- GROUP BY句でグループ化されたデータに対して実行されます。
- 集計関数を使用することができます。
まとめ
WHERE句
は条件による絞り込み、GROUP BY句
はグループ化、HAVING句
はグループ化されたデータに対する条件絞り込みに使用されます。- これらの句は、それぞれ異なる目的で用いられ、実行順序も意識することが重要です。
補足
- 上記は基本的な解説であり、状況によっては例外もあります。
- 詳細については、SQL Serverの公式ドキュメントを参照してください。
その他
- 本回答は、分かりやすさを重視し、簡潔に説明しています。
例1:顧客の注文数と合計金額を、国別にグループ化して表示する
SELECT
Country,
COUNT(*) AS OrderCount,
SUM(OrderAmount) AS TotalOrderAmount
FROM Orders
WHERE OrderDate >= '2023-01-01'
GROUP BY Country
HAVING OrderCount > 10;
解説
WHERE句
で、2023年1月1日以降の注文のみを抽出します。GROUP BY句
で、国別に注文をグループ化します。HAVING句
で、注文数が10件を超える国のみを抽出します。
例2:社員の平均給与を、部署別にグループ化して表示し、平均給与が10万円を超える部署のみを表示する
SELECT
Department,
AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY Department
HAVING AverageSalary > 100000;
これらの例は、WHERE句
, GROUP BY句
, HAVING句
の基本的な使い方を示しています。
- 上記の例では、集計関数 (
COUNT()
,SUM()
,AVG()
) を使用していますが、HAVING句
では集計関数だけでなく、グループ化された列の値を比較する条件なども指定できます。 - より複雑なクエリを作成するには、
JOIN
やSUBQUERY
などの句と組み合わせて使用することができます。
サブクエリを使用すると、複雑な条件をより柔軟に記述することができます。
SELECT
Country,
COUNT(*) AS OrderCount,
SUM(OrderAmount) AS TotalOrderAmount
FROM Orders
WHERE Country NOT IN (
SELECT Country
FROM Orders
GROUP BY Country
ORDER BY COUNT(*) DESC
LIMIT 1
)
GROUP BY Country;
- 内側のサブクエリで、注文数が最も多い国のリストを取得します。
- 外側のクエリで、内側のサブクエリで取得した国を除外して、注文数と合計金額をグループ化して表示します。
ウィンドウ関数を使用すると、集計結果に対してさらに条件絞り込みや計算を行うことができます。
例:各顧客の注文履歴の中で、注文金額が最も高い注文の情報を表示する
SELECT
CustomerID,
OrderID,
OrderAmount
FROM Orders
ORDER BY CustomerID, OrderAmount DESC
ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderAmount DESC) AS Rank
WHERE Rank = 1;
ROW_NUMBER()
ウィンドウ関数を使用して、各顧客の注文履歴の中で、注文金額が大きい順に順位を付けます。WHERE句
で、Rankが1のレコードのみを表示します。
ピボットテーブルは、集計結果を双方向表形式で表示するのに役立ちます。
ツール
- Excelなどの表計算ソフト
- SQL Server Reporting ServicesなどのBIツール
- ピボットテーブル機能を使用して、集計結果を双方向表形式で表示します。
- 行:国
- 列:年
- 値:注文数または合計金額
上記以外にも、集計や条件絞り込みを行う方法はいくつかあります。
CTE
(Common Table Expression)MATERIALIZED VIEW
UDF
(User Defined Function)
WHERE句
, GROUP BY句
, HAVING句
以外にも、集計や条件絞り込みを行う方法はいくつかあります。
それぞれの方法の特徴を理解し、状況に応じて適切な方法を選択することが重要です。
sql sql-server sql-server-2005