8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

选择列表中的列无效的原因在于它不包含在聚合函数或 GROUP BY 子句中

Nihit Raj 1月前

45 0

我收到一个错误 - 选择列表中的列“Employee.EmpID”无效,因为它不包含在聚合函数或 GROUP BY 子句中。select loc.LocationID, emp.EmpIDfrom

我收到一个错误 -

选择列表中的列“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。相反,我们提及该位置的员工总数,即我们应该对在该位置工作的员工进行 SUM()。为什么我们要采用后一种方式,我不确定。所以,这解释了错误中的“它不包含在任何聚合函数中”部分。

子句部分的错误 GROUP BY 该如何解释

帖子版权声明 1、本帖标题:选择列表中的列无效的原因在于它不包含在聚合函数或 GROUP BY 子句中
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Nihit Raj在本站《mysql》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 假设我有下表 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 查询时获得未定义的结果,并且在选择列表中包含既不属于分组条件也不出现在聚合函数(SUM、MIN、MAX 等)中的任何列。

    修复方法可能如下:

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

    现在很明显您想要以下结果:

    a   x
    --------
    1   ghi
    2   pqr
    
  • Bill - 顺便说一句 - 您说“不清楚在每个组中为 b 选择哪个值”。为什么 SQL 不将 b1、b2、b3 都放在该列中?

  • @davidblaine,MySQL 有一个函数 GROUP_CONCAT() 用于此目的。dev.mysql.com/doc/refman/5.5/en/… 但在标准 SQL 中,每列应该只包含一个值。这也是关系理论的基础。

  • 我认为这是 MSSQL 的缺点,因为当我们有一些 LEFT JOIN 并按正确表的 PK 分组时,合理地讲我们必须能够轻松获取正确表的列而不会出现任何模棱两可的情况(MySQL 处理这种情况)。

  • @Postlagerkarte,很高兴听到他们终于开发出一个聚合函数来执行这项常见任务。使用 FOR XML PATH 似乎总是一种丑陋的黑客行为。

  • Miro 1月前 0 只看Ta
    引用 7

    如果您设置为禁用 MYSQL 服务器模式( ONLY_FULL_GROUP_BY 默认情况下是 ,您的查询将正常工作 。但在这种情况下,您使用的是不同的 RDBMS。因此,要使您的查询正常工作, 请将所有非聚合列添加 GROUP BY 子句中,例如

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

    非聚合列意味着该列不会传递到诸如 SUM , MAX , COUNT 等聚合函数中。

  • “我想要做的就是把这些桌子连接起来,然后将所有员工集中在一个特定的位置。”

    听起来你想要的是 SQL 语句的输出列出公司里的每个员工,但首先是阿纳海姆办公室的所有员工,然后是布法罗办公室的员工,然后是克利夫兰办公室的员工(A、B、C,明白了,显然我不知道你有哪些地点)。

    在这种情况下,请放弃 GROUP BY 语句。您只需要 ORDER BY loc.LocationID

  • 这不是我的意思。 order by 会将同一城市的所有员工一个接一个地排列。 它会对所有城市执行此操作。 我需要知道一个城市有多少名员工,而不是一个城市有哪些员工。 有道理吗?

  • 然后将原始示例的第一行替换为:SELECT loc.LocationID, COUNT(*)

  • M.O. 1月前 0 只看Ta
    引用 11

    是的,这就是我想要的。谢谢。看来我没有正确提出问题。但是,Bill Karwin 的回答让我明白了错误背后的原因。所以我接受了他的回答。再次感谢。

  • 基本上,这个错误的意思是,如果您要使用该 GROUP BY 子句,那么您的结果将是一个关系/表,其中每个组都有一行,因此在您的 SELECT 语句中您只能“选择”您要分组的列并在该列上使用聚合函数,因为其他列不会出现在结果表中。

  • 总结得很好。我在这里发布了补充答案 - .com/a/63545571/2806819

返回
作者最近主题: