我得到一个错误

列的员工。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子句部分?


当前回答

“我想做的就是把所有的桌子连接起来,然后把所有的员工分组 在一个特定的地点。”

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

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

其他回答

“我想做的就是把所有的桌子连接起来,然后把所有的员工分组 在一个特定的地点。”

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

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

假设我有如下表格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

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

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

非聚合列意味着该列不会传递给聚合函数,如SUM、MAX、COUNT等。

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