使用 HAVING 篩選群組
使用 GROUP BY 子句建立群組之後,您可以進一步篩選結果。 HAVING 子句作為群組的篩選條件。 這類似於在 FROM 子句傳回的資料列上,WHERE 子句作為篩選條件。
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 子句傳回的資料列。 在查詢中,如果 WHERE 子句之後有 GROUP BY ... HAVING 區段,則在處理 GROUP BY 之前,WHERE 子句會先篩選資料列,導致可建立的群組可能變少。
HAVING 子句是在 GROUP BY 之後才處理,而且只處理群組,而不是詳細資料列。 總括來說:
- WHERE 子句在任何群組形成之前篩選資料列
- HAVING 子句篩選全部群組,且通常會考慮彙總的結果。