当前位置: 首页 > 面试题库 >

在选择列表中,“列原因”无效,因为该列原因未包含在聚合函数或GROUP BY子句中。

诸葛绍元
2023-03-14
问题内容

我有一个错误-

选择列表中的“ 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 错误的子句部分的解释是什么?


问题答案:

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


 类似资料: