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