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 句はグループ全体をフィルターし、通常、集計結果を確認します。