与其他列不同的总和(Sum Distinct By Other Column)

问题

我对 PL/SQL 有疑问,因为我是 PL/SQL 世界的新手。 假设我有这样的桌子。

COlumnA  COlumnB    COlumnC
1      5000000000   X
1      5000000000   X
2      4350000000   X
2      4350000000   X
3      10000000000  X
3      10000000000  X
3      10000000000  X
4      1809469720   Y
5      10000000000  X
5      10000000000  X
6      3000000000   X
6      3000000000   X

我想产生如下的选择语句。

ColumnC |Sum
X       |32350000000
Y       |1809469720

我已经在 Oracle 12c 中通过内部查询解决了这个问题,但是当系统需要转到 Oracle 11g 时,我的查询不再起作用,我只需要一个 select 语句就可以得到预期的结果。

有人可以建议吗?

谢谢!

回答1

这就是我想出的……在 SELECT 列表中使用内联视图而不是相关子查询。

  SELECT d.columnc        AS "ColumnC"
       , SUM(d.columnb)   AS "Sum"
    FROM ( SELECT t.columna
                , t.columnb
                , t.columnc
             FROM tablea t
            GROUP
               BY t.columna
                , t.columnb
                , t.columnc
         ) d
   GROUP
      BY d.columnc

这使用内联视图(别名为“d”)从 tablea 返回一组“不同”的行。 我们可以使用 GROUP BY 子句或包含 DISTINCT 关键字,甚至通过编写使用 UNION 集合运算符的查询来获得不同的集合。

只需将该查询包装在括号中,分配一个别名,然后在 FROM 子句中使用它,就好像它是一个表或视图一样。

该语句的操作类似于在 FROM 子句中引用 VIEW。

您不需要这样做,只是为了说明上面的查询是如何操作的。 我们可以创建一个视图,如下所示:

  CREATE VIEW d AS 
           SELECT t.columna
                , t.columnb
                , t.columnc
             FROM tablea t
            GROUP
               BY t.columna
                , t.columnb
                , t.columnc

然后我们可以引用另一个查询的 FROM 子句中的视图,例如

  SELECT d.columnc        AS "ColumnC"
       , SUM(d.columnb)   AS "Sum"
    FROM d
   GROUP
      BY d.columnc

但我们实际上并不需要创建 VIEW 对象。 我们可以将视图查询包含为“内联视图”。


我不相信 Oracle 11g 将内联视图的嵌套限制为三个级别。 我怀疑您遇到的限制与相关子查询有关。 子查询可以引用外部查询中的列,但只能引用它所使用的查询中的列。它不能引用更远的查询中的列。 (我还没有通过测试确认,但这是我的回忆。)

这是来自 Oracle 的实际 ORA- 和/或 PLS- 错误消息将有助于识别您遇到的限制。

回答2

首先找到COlumnACOlumnBCOlumnCdistinct值,然后进行聚合

试试这个

select COlumnC,sum(COlumnB) from
(
select distinct COlumnA,COlumnB,COlumnC
from Table1
) 
Group by COlumnC
回答3

或者您可以简单地使用此查询。

Select sum(columnB) as sum,columnC from table_name group by ColumnC;

更多相关内容:请点击查看