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