提问人:david blaine 提问时间:12/22/2012 最后编辑:dreftymacdavid blaine 更新时间:1/31/2020 访问量:1073337
Column 的原因在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句 [duplicate] 中
Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause [duplicate]
问:
我遇到了一个错误 -
列“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。相反,我们提到了该位置的员工总数,即我们应该对在该位置工作的员工进行求和。我们为什么要采用后一种方式,我不确定。 因此,这解释了错误的“它不包含在任何一个聚合函数中”部分。
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
输出应有两行,一行 where ,第二行 where 。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
基本上,这个错误所说的是,如果你要使用这个子句,那么你的结果将是一个关系/表,每个组都有一行,所以在你的语句中,你只能“选择”你要分组的列,并在该列上使用聚合函数,因为其他列不会出现在结果表中。GROUP BY
SELECT
“我想做的就是加入表格,然后对所有员工进行分组 一起在一个特定的位置。
听起来你想要的是 SQL 语句的输出列出公司中的每个员工,但首先是阿纳海姆办公室的所有人,然后是布法罗办公室的人,然后是克利夫兰办公室的人(A、B、C,明白了,显然我不知道你有什么位置)。
在这种情况下,将丢失 GROUP BY 语句。您所需要的只是ORDER BY loc.LocationID
如果设置为禁用服务器模式(默认情况下是),则查询将起作用。但在本例中,您使用的是不同的 RDBMS。因此,要使查询正常工作,请将所有非聚合列添加到子句中,例如MYSQL
ONLY_FULL_GROUP_BY
GROUP BY
SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2
非聚合列表示该列不会传递到聚合函数(如 、 、 等)。SUM
MAX
COUNT
评论