HAVING

因為 WHERE 子句在 GROUP BY 之前被評估,所以你不能使用 WHERE 來削減分組的結果(通常是聚合函式,例如 COUNT(*))。為了滿足這種需要,可以使用 HAVING 子句。

例如,使用以下資料:

DECLARE @orders TABLE(OrderID INT, Name NVARCHAR(100))

INSERT INTO @orders VALUES
( 1, 'Matt' ),
( 2, 'John' ),
( 3, 'Matt' ),
( 4, 'Luke' ),
( 5, 'John' ),
( 6, 'Luke' ),
( 7, 'John' ),
( 8, 'John' ),
( 9, 'Luke' ),
( 10, 'John' ),
( 11, 'Luke' )

如果我們想獲得每個人的訂單數量,我們會使用

SELECT Name, COUNT(*) AS 'Orders'
FROM @orders
GROUP BY Name

得到

名稱 命令
馬特 2
約翰
盧克 4

但是,如果我們想將此限制為已經放置兩個以上訂單的個人,我們可以新增 HAVING 子句。

SELECT Name, COUNT(*) AS 'Orders'
FROM @orders
GROUP BY Name
HAVING COUNT(*) > 2

會屈服

名稱 命令
約翰
盧克 4

請注意,與 GROUP BY 非常相似,HAVING 中的列必須與 SELECT 語句中的列完全匹配。如果在上面的例子中我們反而說過

SELECT Name, COUNT(DISTINCT OrderID)

我們的 HAVING 條款不得不說

HAVING COUNT(DISTINCT OrderID) > 2