列的原因在select列表中无效,因为它不包含在聚合函数或GROUP BY子句中

可能重复:
SQL中的GROUP BY /聚合函数混淆

我得到一个错误 – Column'Employee.EmpID'在select列表中是无效的,因为它不包含在聚合函数或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) 

我不明白为什么我得到这个错误。 我想要做的就是join表格,然后把所有员工分在一起。

我想我对自己的问题有一个部分的解释。 告诉我,如果它确定 –

要将在同一地点工作的所有员工分组,我们必须首先提到LocationID。

然后,我们不能/不会提及它旁边的每个员工ID。 相反,我们提到该位置的雇员总数,即我们应该SUM()在该位置工作的雇员。 为什么我们这样做呢,我不确定。 所以,这就解释了“它不是包含在一个集合函数中”的部分错误。

错误中“GROUP BY子句”部分的解释是什么?

假设我有下面的表格T

 ab -------- 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的值应该是多less? 在每种情况下有三种可能性,查询中没有任何内容可以清楚地说明在每个组中为bselect哪个值。 这是不明确的。

这将演示单值规则 ,该规则禁止您在运行GROUP BY查询时获得的未定义结果,并且在select列表中包含既不属于分组条件也不出现在聚合函数(SUM, MIN,MAX等)。

解决它可能看起来像这样:

 SELECT a, MAX(b) AS x FROM T GROUP BY a 

现在很明显,你需要以下结果:

 ax -------- 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等。

“我想要做的就是join表格,然后把所有员工聚集在一起。”

这听起来像你想要的是SQL语句的输出列出公司中的每个员工,但首先是所有在阿纳海姆办公室的人,然后是在布法罗办公室的人,然后是在克利夫兰办公室的人(A, B,C,明白了,显然我不知道你有什么位置)。

在这种情况下,会丢失GROUP BY语句。 所有你需要的是ORDER BY loc.LocationID

基本上,这个错误是说,如果你打算使用GROUP BY子句,那么你的结果将是一个关系/表与每个组的行,所以在你的SELECT语句中,你只能“select”的列,您正在分组并在该列上使用聚合函数,因为其他列将不会出现在结果表中。