使用 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 子句篩選全部群組,且通常會考慮彙總的結果。