在 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】:您可以使用CTE
和MATERIALIZE
提示来获取所需的输出,如下所示:
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,则需要根据自定义价格字段计算税款并添加到购物车页面的总计中