我遇到了错误-
在选择列表中,列'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
子句部分的解释是什么?#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
非聚合列意味着该列不会传递给聚合函数,例如
SUM
,MAX
,COUNT
等。评论
这就像具有多个内部联接的护身符一样。
–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
评论
使用分组依据时,必须特别选择要分组的事物您可能将GROUP BY与ORDER BY混淆了。分组用于汇总列;排序是对结果进行排序。