假设我们在表中有以下数据:
groupName volume class mark
---------- ------- ------ ----
group1 50 1 o
group1 50 1 o
group1 50 1 x
group1 25 2 o
group2 25 1 x
group2 17 3 x
group2 11 2 o
group3 11 1 o
group3 19 3 x
并且需要在末尾添加总计行(SUM
用于数量和NULL
其余列)。
我知道我需要的可以通过将总计与union all
as 相加来实现:
select 0 as isTotal, groupName, class, mark, volume
from dataTable
union all
select 1, NULL, NULL, NULL, sum(volume)
from dataTable
order by isTotal, groupName, class
但这种方式表被扫描两次。
为避免两次扫描数据,我尝试使用group by
:
select grouping(groupName) as isTotal, groupName, class, mark, sum(volume) as volume
from dataTable
group by grouping sets ((), (groupName, class, mark, volume))
order by isTotal, groupName, class
这样只有一个表扫描,我几乎得到了我需要的东西,除了样本数据的前两行(它们是重复的)被合并为一个,我需要将重复的行保存为单独的行。
问题: 是否可以在添加总计行的情况下获取表格数据,以便扫描一次表格数据并将重复项保存为单独的行?
期望的结果是union all
查询返回的结果:
isTotal groupName class mark volume
------- ----------- ------ ---- -------
0 group 1 1 o 50
0 group 1 1 o 50
0 group 1 1 x 50
0 group 1 2 o 25
0 group 2 1 x 25
0 group 2 2 o 11
0 group 2 3 x 17
0 group 3 1 o 11
0 group 3 3 x 19
1 NULL NULL NULL 258
查询返回的结果group by grouping sets
:
isTotal groupName class mark volume
------- ---------- ------ ---- -------
0 group 1 1 o 100
0 group 1 1 x 50
0 group 1 2 o 25
0 group 2 1 x 25
0 group 2 2 o 11
0 group 2 3 x 17
0 group 3 1 o 11
0 group 3 3 x 19
1 NULL NULL NULL 258