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

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]

提问人:david blaine 提问时间:12/22/2012 最后编辑:dreftymacdavid blaine 更新时间:1/31/2020 访问量:1073337

问:

我遇到了一个错误 -

列“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 

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

对上述更正,符合 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。相反,我们提到了该位置的员工总数,即我们应该对在该位置工作的员工进行求和。我们为什么要采用后一种方式,我不确定。 因此,这解释了错误的“它不包含在任何一个聚合函数中”部分。

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

sql 分组依据 聚合函数

评论

1赞 Alex W 12/22/2012
当您使用分组依据时,您必须专门选择要分组的事物

答:

715赞 Bill Karwin 12/22/2012 #1

假设我有下表:T

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

我做以下查询:

SELECT a, b
FROM T
GROUP BY a

输出应有两行,一行 where ,第二行 where 。a=1a=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
19赞 Alex W 12/22/2012 #2

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

21赞 ExactaBox 12/22/2012 #3

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

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

在这种情况下,将丢失 GROUP BY 语句。您所需要的只是ORDER BY loc.LocationID

97赞 John Woo 12/22/2012 #4

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

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

非聚合列表示该列不会传递到聚合函数(如 、 、 等)。SUMMAXCOUNT