使用 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 子句會篩選整個群組,而且通常會查看匯總的結果。