【问题标题】:why some nested aggregate case does not work?为什么某些嵌套聚合案例不起作用?
【发布时间】:2020-06-12 07:29:19
【问题描述】:

如:select sum(b),sum(c),sum(sum(b)+sum(c)) from t1 group by a;

在 oracle 中,它给出了异常:'ORA-00979: not a GROUP BY expression' 指向 sum(b) 中 b 的指针。

在我看来,计划是:

第一步:

select sum(b),sum(c) from t1 group by a; //sub1

第二步:

select sum(sum(b)+sum(c)) from sub1;

为什么 oracle 会给出异常?

【问题讨论】:

  • 为什么不直接使用sum(a + b)
  • 谢谢,指针是那个语法异常,是oracle的bug吗?
  • 不,在我看来,这不是一个错误。 sum(sum(a)+sum(b)) 所期望的只是ab 列的所有值的总和,表示为sum(a) + sum(b)sum 是聚合函数,而不是加法函数。
  • 不,这不是错误。根本不支持嵌套聚合
  • 不,这不是错误。如果你真的想写,你必须使用第三个 sum 的分析版本: sum(sum(b)+sum(c)) over () ,或者你在使用 sub-query/with 子句

标签: sql oracle oracle11g group-by aggregate-functions


【解决方案1】:

您正在混合两个级别的聚合。

第一级聚合是当你“group by a”时。如果您单独执行此操作,则每个A 的值都会得到一行。 sum(b)sum(c) 将为这些行中的每一行提供特定值。

第二级聚合使用第一级的结果。当您说sum(sum(b)+sum(c)) 时,您正在对第一次聚合的结果进行第二次聚合。第二次聚合只有一个结果,而且只有一行。

由于最终输出中只有一行,那么多个sum(b)值可以去哪里?

也许你认为sum(b) 本身应该是T1 每一行中所有B 的总和?这不是语法的工作方式。 sum(b) 表示 一个 聚合,而不是两个,因此它始终是 group by 操作的直接结果。

有效的是select sum(sum(b)),sum(sum(c)),sum(sum(b)+sum(c)) from t1 group by a;。现在您在各处进行两级聚合。

【讨论】:

  • 非常感谢,更多的例子是,这个sql:select sum(b), sum(b+sum(b)) from t1 group by b; 效果很好,而且我认为sum(b) 和sum(b+sum(b)) 是同一级别的,对吧?
  • 我认为第一个sum(b)sum(b+sum(b))中的第二个sum(b)不同,第一个sum(b)是从第一级输出的b计算出来的。
  • 首先尝试仅使用一个聚合级别:with t1 as (select 1 b from dual) select b, sum(b) from t1 group by b; 您可以对分组依据的值使用聚合函数,结果相同。由于在第一级是允许的,所以可以嵌套。如果你觉得这很奇怪,那么只有一层聚合就已经很奇怪了。
  • 是的,我知道可以对分组依据的值使用聚合函数。但是在这种情况下嵌套聚合结果很奇怪。例如 create table t1(a int, b int, c int); insert into t1 values(1,2,3)(10,20,30)(10,20,33); 这个 sql select sum(b), sum(b+sum(b)) from t1 group by b; 给出结果:(22, 64)。
  • 第一层:select b, sum(b) from b group by b;,输出为(2, 2)(20, 40),这个可以理解。但第二级:select sum(b), sum(b+sum(b)) from t1 group by b; 输出是 (22,64)。就是说第一个sum(b)sum(b+sum(b))里​​面的sum(b)不一样,这个是最难理​​解的。
猜你喜欢
  • 2020-05-15
  • 2014-06-25
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多