列的原因在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中[重复]

Posted

技术标签:

【中文标题】列的原因在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中[重复]【英文标题】:Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause [duplicate] 【发布时间】:2021-12-26 07:08:13 【问题描述】:

我遇到了一个错误 -

列 'Employee.EmpID' 在选择列表中无效,因为它是 不包含在聚合函数或 GROUP BY 子句中。


select loc.LocationID, emp.EmpID
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 

这种情况符合比尔·卡尔文给出的答案。

以上更正,适合 ExactaBox 的回答 -

select loc.LocationID, count(emp.EmpID) -- not count(*), don't want to count nulls
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 

原始问题 -

对于 SQL 查询 -

select *
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by (loc.LocationID)

我不明白为什么会出现此错误。我要做的就是加入表格,然后将特定位置的所有员工分组在一起。

我想我对自己的问题有部分解释。告诉我是否可以 -

要对在同一地点工作的所有员工进行分组,我们必须首先提及 LocationID。

然后,我们不能/不会在其旁边提及每个员工 ID。相反,我们提到了该位置的员工总数,即我们应该 SUM() 在该位置工作的员工。为什么我们用后一种方式做,我不确定。 因此,这解释了错误的“它不包含在任一聚合函数中”部分。

GROUP BY 子句部分错误的解释是什么?

【问题讨论】:

当您使用 group by 时,您必须选择具体要分组的内容 您可能将GROUP BYORDER BY 混淆了。分组用于聚合列;排序是对结果进行排序。 【参考方案1】:

假设我有下表T

a   b
--------
1   abc
1   def
1   ghi
2   jkl
2   mno
2   pqr

然后我执行以下查询:

SELECT a, b
FROM T
GROUP BY a

输出应该有两行,第一行是a=1,第二行是a=2

但是 b 的值应该在这两行中的每一行上显示什么?在每种情况下都有三种可能性,查询中的任何内容都没有明确说明在每个组中为 b 选择哪个值。模棱两可。

这演示了单值规则,它禁止您在运行 GROUP BY 查询时获得未定义的结果,并且您在选择列表中包含任何不属于分组的列条件,也不会出现在聚合函数中(SUM、MIN、MAX 等)。

修复它可能如下所示:

SELECT a, MAX(b) AS x
FROM T
GROUP BY a

现在很明显,您想要以下结果:

a   x
--------
1   ghi
2   pqr

【讨论】:

Bill - 顺便说一句 - 你说它“不清楚在每个组中为 b 选择哪个值”。为什么 SQL 不将 b1,b2,b3 放在该列中? @davidblaine,mysql 有一个函数 GROUP_CONCAT() 。 dev.mysql.com/doc/refman/5.5/en/… 但是在标准 SQL 中,每一列应该只包含一个值。这也是关系理论的基础。 喜欢人们花时间使用第一原理进行解释。很好的解释比尔。谢谢。 我认为这是 MSSQL 的缺点,因为当我们有一些 LEFT JOIN 并按右表的 PK 分组时,那么合理地我们必须能够轻松地获得右表的列而不会产生任何歧义情况(MySQL 处理这个)。 @Postlagerkarte,很高兴听到他们最终制作了一个聚合函数来完成这项常见任务。使用 FOR XML PATH 似乎总是一个丑陋的 hack。【参考方案2】:

如果您设置为禁用ONLY_FULL_GROUP_BY 服务器模式(默认情况下是),您的查询将在MYSQL 下工作。但在这种情况下,您使用的是不同的 RDBMS。因此,为了使您的查询正常工作,将所有非聚合列添加到您的 GROUP BY 子句中,例如

SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2

非聚合列表示该列未传递到聚合函数,如 SUMMAXCOUNT 等。

【讨论】:

这就像一个具有多个内部连接的魅力。 如何用 ef core 写代码【参考方案3】:

“我要做的就是加入表格,然后将所有员工分组 一起在一个特定的位置。”

听起来您希望 SQL 语句的输出列出公司中的每个员工,但首先是阿纳海姆办公室的所有人,然后是布法罗办公室的人,然后是克利夫兰办公室的人(A、B、C,明白了,显然我不知道你有什么位置)。

在这种情况下,请丢失 GROUP BY 语句。你只需要ORDER BY loc.LocationID

【讨论】:

我不是这个意思。 order by 会将所有员工一个接一个地放在同一个城市。它将为所有城市执行此操作。我需要知道一个城市有 多少 名员工,而不是知道一个城市中有哪些员工。有意义吗? 然后将原始示例的第一行替换为:SELECT loc.LocationID, COUNT(*) 是的,这就是我想要的。谢谢。看起来我没有正确地提出我的问题。但是,Bill Karwin 的回答让我明白了错误背后的原因。所以我接受了他的。再次感谢。【参考方案4】:

基本上,这个错误的意思是,如果你要使用 GROUP BY 子句,那么你的结果将是一个关系/表,每个组都有一行,所以在你的 SELECT 语句中你只能“选择”您作为分组依据的列并在该列上使用聚合函数,因为其他列不会出现在结果表中。

【讨论】:

很好的总结。我在这里发布了一个补充答案 - ***.com/a/63545571/2806819

以上是关于列的原因在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL:选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中[关闭]

列 'CM.PfmFolder.Id' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中

列“在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中”]]

列在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。[ntext] [重复]

在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”

选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中