首页 文章

列的原因在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中[重复]

提问于
浏览
213

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

我收到了一个错误 -

列'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

ORIGINAL QUESTION -

对于SQL查询 -

select *
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by (loc.LocationID)

我不明白为什么我会收到这个错误 . 我想要做的就是加入表格,然后将特定位置的所有员工分组在一起 .

I think I have a partial explanation for my own question. Tell me if its ok -

要对在同一位置工作的所有员工进行分组,我们必须首先提及LocationID .

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

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

4 回答

  • 452

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

  • 14

    如果设置为禁用 ONLY_FULL_GROUP_BY 服务器模式(默认情况下),您的查询将在 MYSQL 中工作 . 但在这种情况下,您使用的是不同的RDBMS . 因此,为了使您的查询有效, add all non-aggregated columns 到您的 GROUP BY 子句,例如

    SELECT col1, col2, SUM(col3) totalSUM
    FROM tableName
    GROUP BY col1, col2
    

    非聚合列表示该列未传递到聚合函数,如 SUMMAXCOUNT 等 .

  • 8

    假设我有以下表 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查询时获得的未定义结果,并且您在select-list中包含既不属于分组条件的任何列,也不会出现在聚合函数中(SUM, MIN,MAX等) .

    修复它可能如下所示:

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

    现在很清楚你想要以下结果:

    a   x
    --------
    1   ghi
    2   pqr
    
  • 51

    “我想要做的就是加入表格,然后将特定地点的所有员工分组在一起 . ”

    听起来你想要的是SQL语句的输出列出公司的每个员工,但首先是阿纳海姆办事处的所有人,然后是布法罗办事处的人,然后是克利夫兰办事处的人(A, B,C,得到它,显然我不知道你有什么位置) .

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

相关问题