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