我有一个错误 -
专栏"员工.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
非聚集列表示该列未传递到诸如SUM
,MAX
,COUNT
等的汇总功能中。
基本上,此错误是在说您要使用GROUP BY
子句,那么您的结果将是每个组的关系/表,因此您的SELECT
语句您只能"选择"您要分组的列并在该列上使用聚合功能,因为其他列不会出现在结果表中。
"我要做的就是加入桌子,然后将所有员工分组 一起在特定位置。"
听起来您想要的是SQL声明的输出,以列出公司中的每个员工,但首先是Anaheim办公室中的所有人员,然后是布法罗办公室的人们,然后是克利夫兰办公室的人们(a,b,c,得到它,显然我不知道你有哪些位置)。
在这种情况下,通过语句丢失小组。您只需要ORDER BY loc.LocationID