【问题标题】:Select query it is not contained in either an aggregate function or the GROUP BY clause选择查询它不包含在聚合函数或 GROUP BY 子句中
【发布时间】:2016-08-23 01:05:23
【问题描述】:

我收到此错误:

消息 8120,级别 16,状态 1,程序 ReportEmployeesOnLeave,第 17 行 选择列表中的“Employee.EmployeeId”列无效,因为它 不包含在聚合函数或 GROUP BY 中 子句。

【问题讨论】:

  • TotalAbsents 后面不是少了一个逗号吗?
  • @GinoPane :别担心它是注释代码。
  • @Gino Pane 兄弟该行已被评论。

标签: sql stored-procedures group-by


【解决方案1】:

你不明白错误信息怎么办?这是不言自明的。这意味着:如果您使用group by,则所有选定的属性都必须在group by 或聚合函数中(COUNT()SUM() 等)。

因此,如果您更正了您的 group by,您就不应该有任何错误:

...
GROUP BY   TC.Date
,          TC.DayName
,          TC.DayType
,          TC.ScheduleId
,          TC.LeaveTaken
,          TC.Remarks
,          E.EmployeeId
,          E.EmployeeNo
,          E.Name
,          E.ScheduleId
,          C.BusinessName

这是否给出了您正在寻找的结果,这是另一个问题。

对于以后的问题:请将代码添加为文本,而不是图片。这样回答者就可以简单地复制粘贴,而不是全部输入。

编辑:如果你不想group by你选择的所有属性,你可以使用窗口函数(假设sql server 2012或更高版本):

SELECT       * -- Everything you need
,            COUNT(TC.AbsentCalculation) OVER(PARTITION BY E.Name, E.EmployeeId) AS AbsentCount
,            SUM(TC.AbsentCalculation) OVER(PARTITION BY E.Name, E.EmployeeId) AS TotalAbsents
FROM         ...

如果你实现了这个,你根本不需要GROUP BY

【讨论】:

  • 已尝试将分配放入文本格式,但我收到此验证错误“您的帖子似乎包含格式不正确的代码”来自 stackoverflow。
  • 实际上我想获取 2 个日期之间的出勤记录,但我只想按名称和 EmployeeId 分组,如果我将每个选择都放在分组中,我无法在这两个日期之间获得所需的所有行日期。
【解决方案2】:

将所有字段写入Group By原因

【讨论】:

  • 实际上我想获取 2 个日期之间的出勤记录,但我只想按名称和 EmployeeId 分组,如果我将每个选择都放在分组中,我无法在这两个日期之间获得所需的所有行日期。
  • Group by 有一个规则,即在没有聚合函数的情况下在 select 和 from(即获取列)之间写入的字段应写入“Group By”原因。
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2011-07-04
  • 2013-08-17
相关资源
最近更新 更多