HAVING を使用してグループをフィルター処理する
GROUP BY 句を使用してグループを作成したら、結果をさらにフィルター処理できます。 HAVING 句は、グループのフィルターとして機能します。 これは、WHERE 句が FROM 句によって返される行に対するフィルターとして機能する方法と似ています。
HAVING 句を使用すると、概念的には WHERE 句の述語に似た検索条件を作成し、GROUP BY 句によって返される各グループをテストできます。
次の例では、各顧客の注文をカウントし、結果をフィルター処理して、10 を超える注文を行った顧客のみを含めます。
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
HAVING と WHERE の比較
HAVING 句と WHERE 句はどちらもデータをフィルター処理しますが、WHERE は FROM 句によって返される行に対して動作することに注意してください。 GROUP BY ...WHERE 句の後に HAVING セクションがクエリに存在する場合、WHERE 句は GROUP BY が処理される前に行をフィルター処理し、作成できるグループを制限する可能性があります。
HAVING 句は GROUP BY の後で処理され、詳細行ではなくグループでのみ動作します。 要約すると、次のようになります。
- WHERE 句は、グループが形成される前に行をフィルター処理します
- HAVING 句はグループ全体をフィルターし、通常、集計結果を確認します。