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