关于sql:Column的原因在选择列表中无效,因为它不包含在聚合函数或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

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
GROUP BY / aggregate function confusion in SQL

我收到了一个错误 -

Column 'Employee.EmpID' is invalid in the select list because it is
not contained in either an aggregate function or the GROUP BY clause.

1
2
3
4
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的答案 -

1
2
3
4
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查询 -

1
2
3
4
SELECT *
FROM Employee AS emp FULL JOIN Location AS loc
ON emp.LocationID = loc.LocationID
GROUP BY (loc.LocationID)

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

我想我对自己的问题有部分解释。告诉我它是否正常 -

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

然后,我们不能/不提及它旁边的每个员工ID。相反,我们提到该位置的员工总数,即我们应该SUM()在该位置工作的员工。为什么我们这样做呢,我不
因此,这解释了"它不包含在聚合函数中"部分错误。

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


假设我有下表T

1
2
3
4
5
6
7
8
a   b
--------
1   abc
1   def
1   ghi
2   jkl
2   mno
2   pqr

我做以下查询:

1
2
3
SELECT a, b
FROM T
GROUP BY a

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

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

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

修复它可能如下所示:

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

现在很清楚你想要以下结果:

1
2
3
4
a   x
--------
1   ghi
2   pqr


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

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

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


"All I want to do is join the tables and then group all the employees
in a particular location together."

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

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


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