一起选择和分组

时间:2011-11-14 12:05:43

标签: sql group-by db2

我有这样的查询:

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

有人能解释这个错误的原因吗?

2 个答案:

答案 0 :(得分:12)

通常,group by部分中的任何列只有在应用了聚合函数的情况下才能包含在select部分中。或者,另一种方式,select部分中的任何非聚合数据都必须分组。

Otherewise,如何你知道你想做什么。例如,如果您对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子句中的列引用无效。

答案 1 :(得分:2)

SQL将坚持SELECT部分​​中的任何列都包含在GROUP BY部分中,或者在SELECT部分​​中应用了聚合函数。

This article给出了一个很好的解释,为什么会这样。这篇文章是特定于sql server的,但原则应该与所有RDBMS

大致相似