可能重复:SQL中的GROUP BY /聚合函数混淆
我收到了一个错误 -
列'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
ORIGINAL QUESTION -
对于SQL查询 -
select *
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by (loc.LocationID)
我不明白为什么我会收到这个错误 . 我想要做的就是加入表格,然后将特定位置的所有员工分组在一起 .
I think I have a partial explanation for my own question. Tell me if its ok -
要对在同一位置工作的所有员工进行分组,我们必须首先提及LocationID .
然后,我们不能/不提及它旁边的每个员工ID . 相反,我们提到该位置的员工总数,即我们应该SUM()在该位置工作的员工 . 为什么我们这样做,我不确定 . 因此,这解释了“它不包含在聚合函数中”部分错误 .
GROUP BY 子句部分错误的解释是什么?
4 回答
基本上,这个错误说的是,如果你打算使用
GROUP BY
子句,那么你的结果将是一个关系/表,每个组都有一行,所以在SELECT
语句中你只能"select"你的列正在对该列进行分组并使用聚合函数,因为其他列不会出现在结果表中 .如果设置为禁用
ONLY_FULL_GROUP_BY
服务器模式(默认情况下),您的查询将在MYSQL
中工作 . 但在这种情况下,您使用的是不同的RDBMS . 因此,为了使您的查询有效, add all non-aggregated columns 到您的GROUP BY
子句,例如非聚合列表示该列未传递到聚合函数,如
SUM
,MAX
,COUNT
等 .假设我有以下表
T
:我做以下查询:
输出应该有两行,一行
a=1
,第二行a=2
.但是b的值应该显示在这两行中的每一行上?在每种情况下有三种可能性,查询中没有任何内容清楚地表明在每个组中为b选择哪个值 . 这是模棱两可的 .
这演示了单值规则,它禁止在运行GROUP BY查询时获得的未定义结果,并且您在select-list中包含既不属于分组条件的任何列,也不会出现在聚合函数中(SUM, MIN,MAX等) .
修复它可能如下所示:
现在很清楚你想要以下结果:
听起来你想要的是SQL语句的输出列出公司的每个员工,但首先是阿纳海姆办事处的所有人,然后是布法罗办事处的人,然后是克利夫兰办事处的人(A, B,C,得到它,显然我不知道你有什么位置) .
在这种情况下,丢失GROUP BY语句 . 所有你需要的是
ORDER BY loc.LocationID