【问题标题】:Select and Group by together一起选择和分组
【发布时间】:2011-11-14 12:05:42
【问题描述】:

我的查询是这样的:

Select 
  a.abc,
  a.cde,
  a.efg,
  a.agh,
  c.dummy
  p.test
  max(b.this)
  sum(b.sugar)
  sum(b.bucket)
  sum(b.something)

后跟一些外连接和内连接。现在的问题是分组时

group by 
  a.abc,
  a.cde,
  a.efg,
  a.agh,
  c.dummy,
  p.test   

查询工作正常。但是,如果我从组中删除其中任何一个,它会给出:

SQLSTATE: 42803

谁能解释这个错误的原因?

【问题讨论】:

  • -1 用于在未指定 RDBMS 的情况下询问语法错误。这是在浪费大家的时间。
  • 粗略的网络搜索表明它是 DB2,但 42803 是一个状态,而不是错误。解决了这个问题。如果我错了,Abhishek,请恢复或改进。
  • 是的,你是对的 paxdiablo ,我错了,它的 DB2 。

标签: sql group-by db2


【解决方案1】:

一般来说,任何不在group by 部分中的列只有在应用了聚合函数时才能包含在select 部分中。或者,换一种方式,select 部分中的任何非聚合数据都必须分组。

否则,如何你知道你想用它做什么。例如,如果您在a.abc 上分组,那么a.abc 只能用于该分组行(因为a.abc 的所有其他值将出现在不同行中)。这是一个简短的示例,其中包含一个表格:

LastName  FirstName  Salary
--------  ---------  ------
Smith     John       123456
Smith     George     111111
Diablo    Pax        999999

使用查询select LastName, Salary from Employees group by LastName,您会看到:

LastName  Salary
--------  ------
Smith     ??????
Diablo    999999

Smiths 的薪水无法计算,因为您不知道要对其应用什么功能,而这正是导致该错误的原因。换句话说,DBMS 不知道如何处理 123456111111 以获取分组行的单个值。

如果您改为使用 select LastName, sum(Salary) from Employees group by LastName(或 max()min()ave() 或任何其他聚合函数),DBMS 将知道该怎么做。对于sum(),它会简单地添加它们并给你234567

在您的查询中,尝试在没有聚合函数的情况下使用 Salary 的等价物是将 sum(b.this) 更改为仅 b.this 但不将其包含在 group by 部分中。或者,删除group by 列之一,而不将其更改为select 部分中的聚合。

在这两种情况下,您都会有一行具有多个列的可能值。

sqlstate 42803 的DB2 docs at publib 描述了您的问题:

SELECT 或 HAVING 子句中的列引用无效,因为它不是分组列;或者 GROUP BY 子句中的列引用无效。

【讨论】:

  • 另一种说法基本相同的是,select 列表中未聚合的任何列都必须包含在group by 子句中。
  • 好吧!我现在明白了!在图片中。
【解决方案2】:

SQL 将坚持 SELECT 部分中的任何列要么包含在 GROUP BY 部分中,要么在 SELECT 部分中应用聚合函数。

This article 很好地解释了为什么会这样。这篇文章是针对 sql server 的,但是所有 RDBMS 的原理应该大致相似

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多