在 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), () )
您可以使用 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
,因此对性能没有影响或影响很小。
干杯!!
我是 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), () )
您可以使用 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
,因此对性能没有影响或影响很小。
干杯!!