一起选择和分组

Abh*_*ari 5 sql db2 group-by

我有这样的查询:

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)
Run Code Online (Sandbox Code Playgroud)

接着是一些外连接和内连接.现在的问题是在分组时

group by 
  a.abc,
  a.cde,
  a.efg,
  a.agh,
  c.dummy,
  p.test   
Run Code Online (Sandbox Code Playgroud)

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

SQLSTATE: 42803
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这个错误的原因吗?

pax*_*blo 12

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

在这方面,怎么知道你想用它做什么.例如,如果您分组a.abc,则a.abc该分组行只能有一件事(因为所有其他值a.abc将出现在不同的行中).这是一个简短的例子,其中包含一个表:

LastName  FirstName  Salary
--------  ---------  ------
Smith     John       123456
Smith     George     111111
Diablo    Pax        999999
Run Code Online (Sandbox Code Playgroud)

通过查询select LastName, Salary from Employees group by LastName,您可以看到:

LastName  Salary
--------  ------
Smith     ??????
Diablo    999999
Run Code Online (Sandbox Code Playgroud)

史密斯的工资是不可估量的,因为你不知道应用什么函数,这就是导致错误的原因.换句话说,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部分中的聚合.

在这两种情况下,您将拥有一行具有列的多个可能值.

publib for sqlstate 42803 的DB2文档描述了您的问题:

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