在 Oracle 中为多列计算和添加总计行

Calculating and adding the totals row in Oracle for multiple columns

我是 sql 和 Oracle 的新手。下面是一个复杂且耗时的查询的结果。 我想计算 col2、col3 和 col4 的总和。我想在 table 的末尾添加一个总计行。

当前输出。

id  rate rate2 col2      col3  col4
1   2,3  11    10        36     10      
1   2,4  2     229,32    36     229,32      
1   3    44    229,32    36     229,32      
1   4,5  3,4   165,2     36     90,2    
81  1,1  11    30,3      36     30,3        
81  2,3  22    10        36     10      

期望的结果。 (N代表null)

id  rate rate2 col2      col3  col4
1   2,3  11    10        36     10      
1   2,4  2     229,32    36     229,32      
1   3    44    229,32    36     229,32      
1   4,5  3,4   165,2     36     90,2    
81  1,1  11    30,3      36     30,3        
81  2,3  22    10        36     10  
N   N    N     674,14    216    599,14  

我一直在搜索,我可以使用 UNION 来管理它。但是存在性能问题,我正在 运行 宁同一个查询计算总数和追加。底线是我不想 运行 同样耗时的查询两次。还有其他方法可以解决这个问题吗?

提前致谢。

可能最简单的方法是使用 union all:

with q as (
      <your query here>
     )
select q.*
from q
union all
select null, null, null, sum(col2), sum(col3), sum(col4)
from q;

因为Oracle有时会具体化CTE,所以对性能影响不一定很大。

如果您的复杂查询是一个以以下结尾的聚合:

group by id, rate, rate2

那么grouping sets又是一个选项:

group by grouping sets ( (id, rate, rate2), () )

您可以使用 CTEMATERIALIZE 提示来获取所需的输出,如下所示:

with cte as (SELECT /*MATERIALIZE*/ <your query after select>)
select c.*
  from cte c
union all
select null, null, null, sum(col2), sum(col3), sum(col4)
  from cte;

未记录的 MATERIALIZE 提示使用全局 temporary table,因此对性能没有影响或影响很小。

干杯!!