Column在选择列表中无效的原因,因为它既没有包含在聚合函数中,也没有包含在GROUP BY子句中

我得到一个错误

< p >专栏的员工。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。相反,我们提到该位置的员工总数,即我们应该SUM()在该位置工作的员工。我不知道为什么我们要用后一种方式。 因此,这就解释了“它不包含在任何一个聚合函数中”这部分错误

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

962936 次浏览

假设我有下面的表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

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

"我想做的就是加入这些表,然后把所有的员工分组 在一个特定的地点。" < / p >

听起来好像您想让SQL语句的输出列出公司的每个员工,但首先是Anaheim办公室的所有人,然后是Buffalo办公室的人,然后是Cleveland办公室的人(A、B、C,明白了,显然我不知道您有哪些位置)。

在这种情况下,删除GROUP BY语句。你所需要的就是ORDER BY loc.LocationID

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

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

非聚合列意味着该列不会传递给诸如SUMMAXCOUNT等聚合函数。