使用 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 ... HAVING 區段出現在 WHERE 子句之後,WHERE 子句會在處理 GROUP BY 之前篩選資料列,這可能會限制可建立的群組。

HAVING 子句會在 GROUP BY 之後處理,而且只會在群組上運作,而不是詳細數據列。 總結:

  • WHERE 子句在任何群組形成之前篩選資料列
  • HAVING 子句會篩選整個群組,而且通常會查看匯總的結果。