列的原因在选择列表中无效,因为它不包含在汇总函数中,也不包含子句中的组中



我有一个错误 -

专栏"员工.empid"在选择列表中无效,因为它是

不包含聚合函数或组中的组中。

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)

我不明白为什么会遇到这个错误。我要做的就是加入桌子,然后将所有员工在特定位置组合在一起。

我认为我对自己的问题有部分解释。告诉我是否可以 -

要将所有在同一位置工作的员工分组,我们必须首先提及位置ID。

那么,我们不能/不提及旁边的每个员工ID。相反,我们提到该位置的员工总数,即我们应该在该位置工作的员工总结。我不确定为什么我们要以后一种方式这样做。因此,这解释了错误的"它不包含在任何一个聚合函数中"部分。

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选择哪个值。这是模棱两可的。

这演示了单值规则,该规则禁止您在通过查询运行组时获得的未定义结果,并且您在选择列表中都不是分组的一部分的列表中的任何列标准,也不出现在汇总函数(总和,最小,最大等)。

修复它看起来像这样:

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

非聚集列表示该列未传递到诸如SUMMAXCOUNT等的汇总功能中。

基本上,此错误是在说您要使用GROUP BY子句,那么您的结果将是每个组的关系/表,因此您的SELECT语句您只能"选择"您要分组的列并在该列上使用聚合功能,因为其他列不会出现在结果表中。

"我要做的就是加入桌子,然后将所有员工分组 一起在特定位置。"

听起来您想要的是SQL声明的输出,以列出公司中的每个员工,但首先是Anaheim办公室中的所有人员,然后是布法罗办公室的人们,然后是克利夫兰办公室的人们(a,b,c,得到它,显然我不知道你有哪些位置)。

在这种情况下,通过语句丢失小组。您只需要ORDER BY loc.LocationID

最新更新