【发布时间】:2013-11-08 12:34:30
【问题描述】:
在 Querying MS SQL Server 2012 (Training Kit) for Exam 70-461 一书中,它谈到了逻辑处理中查询的GROUP BY 阶段:
此查询的最终结果有一行代表每个组 (除非过滤掉)。因此,所有阶段的表达式 当前分组阶段之后的位置有些有限。全部 在后续阶段处理的表达式必须保证单个 每组价值。如果您引用 GROUP BY 列表中的元素 (例如,国家),你已经有这样的保证,所以这样的 允许参考。但是,如果你想引用一个元素 不是您的 GROUP BY 列表的一部分(例如,empid),它必须是 包含在 MAX 或 SUM 等聚合函数中。那是因为 单个组内的元素中可能有多个值,并且 保证只有一个会被退回的唯一方法是 聚合值。
然后作者提到了他使用COUNT(*) > 1 的HAVING 步骤。我的问题是如果GROUP BY 每组只有 1 行的结果,HAVING 阶段如何使用该单组行来过滤掉任何超过 1 行的组......它的作用是他们还剩下吗?所以我在这里错过了什么。每个组是否有某种隐藏的 COUNT 列?
查询是:
SELECT country, YEAR(hiredate) AS yearhired, COUNT(*) AS numemployees
FROM HR.Employees
WHERE hiredate >= '20030101'
GROUP BY country, YEAR(hiredate)
HAVING COUNT(*) > 1
ORDER BY country , yearhired DESC;
请指教。
【问题讨论】:
-
您可以发布查询吗?
-
Count(*) 在分组阶段之前计算。
-
@Arvo 与分组阶段同时计算,属于同一操作(Stream/hash聚合)
-
我认为在分组之后有一个位置。我不知道有什么实际区别。 SQL select 语句设计稍有错误。
标签: sql sql-server group-by sql-server-2012 having