GROUP BY限制的示例

时间:2013-04-06 00:27:39

标签: sql

在postgreSQL文档中,它说:

  

当存在GROUP BY时,SELECT列表表达式无法引用除聚合函数之外的未分组列,或者未分组列在功能上依赖于分组列,因为否则会有多个可能的值返回未分组的列

我不理解有关“there would otherwise be more than one possible value to return for an ungrouped column”的部分。

有人可以举个例子吗?如何为ungroup列返回多个可能的值?

3 个答案:

答案 0 :(得分:2)

考虑下表:

col_1 | col_2 | col_3
A       10      10
A       11      20
B       20      40
C       40      60

尝试运行此查询,该查询总结了col_3

的值
SELECT col_1, col_2, SUM(col_3)
FROM   t1
GROUP BY col_1

上述查询可以有两个可能的输出:

Output 1: Here, col_2 = 10
---------------------------
col_1   |   col_2   |   SUM(col_3)
A           10          30      
B           20          40
C           40          60

Output 2: Here, col_2 = 11
---------------------------
col_1   |   col_2   |   SUM(col_3)
A           11          30 
B           20          40
C           40          60

这是因为col_2未包含在GROUP BY子句中。 col_3的求和基于col_1的分组按预期发生,但现在SQL引擎不知道你是否想要A的行,其中col_2为11或11。因此,“否则会有多个可能的值返回对于未分组的列“

以上查询可以正常使用MySQL,它将随机返回上述2个输出中的一个,而Oracle / SQL Server将抛出您提到的错误

答案 1 :(得分:1)

  

否则,对于未组合列

,将返回多个可能的值

让我试着用一小部分数据解释一下:

CREATE TABLE yourtable ([year] int, [amt] int);

INSERT INTO yourtable ([year], [amt])
VALUES
  (2012, 50),
  (2012, 60),
  (2011, 100),
  (2011, 89),
  (2013, 25);

这个样本有3个单独的年份,现在我们希望得到每年的金额总和。

如果您使用查询:

select year, sum(amt) TotalPerYear
from yourtable

并且您没有提供GROUP BY列的Year,那么数据库引擎将如何知道为年份选择的值,因为列中有多个值。

GROUP BY说我想要每年的总和,并不是说我想要它决定的任何年份的总和。

select year, sum(amt) TotalPerYear
from yourtable
group by year

select中的每个GROUP BY列确保您获得分组列的正确聚合。

MySQL是一个允许此行为的数据库,它包括选择列表中不在group by或aggregate函数中的列的explicitly states in the docs可能会导致意外结果。

来自MySQL文档:

  

您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。 但是,这主要适用于每个未在GROUP BY中命名的非聚合列中的所有值对于每个组都相同的情况。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 此外,添加每个组的值的选择不会受到添加的影响一个ORDER BY子句。选择值后会对结果集进行排序,而ORDER BY不会影响服务器选择的值。

答案 2 :(得分:0)

假设你有一张人的名单......姓名,城市,电话号码。而且你想要按城市计算人数。所以你选择城市和数量*和按城市分组。在您的查询中包含电话号码(未分组)是没有意义的,因为每个分组很可能会有多个电话号码,并且数据库不知道您想要什么。