首页 > 解决方案 > 聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句中包含的子查询中

问题描述

我正在尝试构建一个查询,该查询对同一 ID 的两个不同字段进行分组和求和。然后我试图只提取分组总数与总和不同的不同记录。

例如 - sum([EstimatedEmployeesAtLocation]) 应该等于分组的 Estimatedtotalemployees 对于每条记录都是相同的。

这就是三个记录的样子

ID                            1,1,1
Estimatedtotalemployees       10,10,10
EstimatedEmployeesAtLocation  6,2,1

我知道问题在于在 where 子句中使用聚合函数,因为查询一直有效,直到我添加 where 子句。但我不知道正确的语法。有人可以建议吗?

select ID, Estimatedtotalemployees, sum([EstimatedEmployeesAtLocation]) emploc
from Rawdata
where sum([EstimatedEmployeesAtLocation]) <> EstimatedTotalEmployees
group by policyNumber, EstimatedTotalEmployees

这是错误消息。聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。我刚刚开始在基本查询之外使用 SQL,因此非常感谢任何帮助 -

标签: sqlcorrelated-subquery

解决方案


SQL 的评估顺序大致如下:

  • FROM - 数据已连接
  • WHERE - 过滤数据
  • GROUP BY - 聚合数据
  • SELECT - 生成结果集

您不能在 WHERE 子句中使用 SUM(...) ,因为它尚未计算;它是作为 GROUP BY 和 SELECT 的一部分完成的

您的选择列表中也不能有 ID,因为您没有按它分组。

您最好提出一个新问题/在此问题中编辑一些细节,以列出您拥有的原始数据(并将其放在顶部的列,向下的行,就像 SSMS 向您显示的那样),您尝试过的(例如上面的 sql),以及您想要的结果是什么(同样,行水平运行,列垂直运行,否则最终会有人给你一个支点)。现在您似乎已经提供了原始数据,但已将其标记为结果数据,并且看起来方向错误,所以我不确定它是否需要旋转

这是我对你所追求的最好的尝试:

select ID, MAX(Estimatedtotalemployees), SUM([EstimatedEmployeesAtLocation]) 
from Rawdata
group by ID
having SUM([EstimatedEmployeesAtLocation]) <> MAX(EstimatedTotalEmployees)

推荐阅读