在 Oracle 中计算并添加多列的总计行

Posted

技术标签:

【中文标题】在 Oracle 中计算并添加多列的总计行【英文标题】:Calculating and adding the totals row in Oracle for multiple columns 【发布时间】:2019-12-30 15:14:58 【问题描述】:

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

电流输出。

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代表空)

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 来管理它。但是存在性能问题,我正在运行相同的查询来计算总数和追加。底线是我不想两次运行相同的耗时查询。有没有其他方法可以解决这个问题?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以使用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,因此对性能没有影响或影响很小。

干杯!!

【讨论】:

【参考方案2】:

可能最简单的方法是使用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), () )

【讨论】:

以上是关于在 Oracle 中计算并添加多列的总计行的主要内容,如果未能解决你的问题,请参考以下文章

折扣后如果总计为 0,则需要根据自定义价格字段计算税款并添加到购物车页面的总计中

计算可迭代元组的行和列总计

在 Woocommerce 中的购物车和结帐总计上插入自定义总计行

SQL:计算Oracle中多列的出现次数

计算所有项目总计到小计 Jquery

在 OBIEE 中将总计添加到数据透视表行的末尾