329

我有一个错误 -

列 '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错误的条款部分的解释是什么?

4

4 回答 4

643

假设我有下表T

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

我执行以下查询:

SELECT a, b
FROM T
GROUP BY a

输出应该有两行,一行 wherea=1和第二行 where a=2

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

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

修复它可能如下所示:

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

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

a   x
--------
1   ghi
2   pqr
于 2012-12-22T03:53:53.143 回答
89

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

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

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

于 2012-12-22T03:59:42.700 回答
19

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

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

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

于 2012-12-22T03:55:58.093 回答
15

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

于 2012-12-22T03:54:50.507 回答