我遇到了错误-


在选择列表中,列'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。相反,我们提到了该位置的员工总数,即我们应该对在该位置工作的员工进行SUM()处理。我不确定为什么要采用后一种方式。
因此,这说明了错误的“部分内容不包含在任何一个汇总函数中”。

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

评论

使用分组依据时,必须特别选择要分组的事物

您可能将GROUP BY与ORDER BY混淆了。分组用于汇总列;排序是对结果进行排序。

#1 楼

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


评论


比尔-顺便说一句-您说的不是“清楚每个组中为b选择哪个值”。 SQL为什么不将b1,b2,b3全部放到该列中?

–大卫·布莱恩
2012年12月22日4:51



@ davidblaine,MySQL为此具有函数GROUP_CONCAT()。 dev.mysql.com/doc/refman/5.5/en/…但是在标准SQL中,每一列应只包含一个值。这也是关系理论的基础。

– Bill Karwin
2012年12月22日在16:45

当人们花时间用第一原理解释时,就喜欢它。出色的解释条例草案。谢谢。

–克劳斯·恩吉(Klaus Nji)
2014年2月21日在19:54



我认为这是MSSQL的缺点,因为当我们有一些LEFT JOIN并按正确表的PK分组时,那么我们就必须能够轻松地获得正确表的列,而不会出现任何歧义(MySQL处理此情况)。

– Alix
16年8月9日在7:53



另外AFAIK MsSQL也有类似GROUP_CONCAT的技巧...嗯...类似STUFF((SELECT('​​-'+ ColName)AS ColName .... FOR XML PATH('')),1,3,'' )。

– Alix
16年8月9日在8:00



#2 楼

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

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


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

评论


这就像具有多个内部联接的护身符一样。

–5377037
17 Dec 5'在19:44



我如何用ef core编写

– Sras
8月5日,下午2:14

#3 楼


“我要做的就是联接表,然后将所有员工分组在特定位置。


听起来像您想要的是SQL语句的输出列出公司中的每个员工,但首先是阿纳海姆办公室的所有人员,然后是布法罗办公室的所有人员,然后是克利夫兰办公室的所有人员(A,B,C,显然我不知道您的位置)。在这种情况下,丢失GROUP BY语句。您只需要ORDER BY loc.LocationID

评论


那并非我的本意。命令将使所有员工一个接一个地位于同一城市。它将为所有城市做到这一点。我需要知道一个城市中有多少雇员,而不是一个城市中的哪些雇员。说得通 ?

–大卫·布莱恩
2012年12月22日在4:20

然后将原始示例的第一行替换为:SELECT loc.LocationID,COUNT(*)

– ExactaBox
2012年12月22日在4:22

是的,那就是我想要的。谢谢。看来我没有正确提出我的问题。但是,比尔·卡文(Bill Karwin)的回答使我明白了错误的原因。所以我接受了他。再次感谢。

–大卫·布莱恩
2012年12月22日下午4:39

#4 楼

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

评论


好总结。我在这里发布了补充性答案-stackoverflow.com/a/63545571/2806819

–银
8月23日9:52