典型的GROUPING / ROLLUP导致Oracle风格的SQL倾向于这样:
C PROMO_ID S_SALES
- ---------- ----------
C 497 26094.35
C 498 22272.4
C 499 19616.8
C 9999 87781668
C 87849651.6
....将列总计或小计(在本例中为C)显式位于总/小计行中。现在,我可以很容易地填充NULL,通过在case语句中放置GROUPING使其看起来像这样:
C TOTAL 87849651.6
但似乎应该非常容易地将该总计/小计行的格式更改为:
87849651.6
或
TOTAL FOR C 87849651.6
然而,对于我的生活,我无法在没有完全使用row_num之类的情况下解决这个问题。我是否遗漏了一些明显的东西,或者这只是一些格式化Oracle不喜欢做的事情?
答案 0 :(得分:2)
您可以使用GROUPING_ID
和CASE
表达式来控制总行中显示的内容。例如:
select case grouping_id(deptno) when 0 then lpad(to_char(deptno), length('Grand Total'))
else 'Grand Total' end as deptno,
sum(sal) as total_salary
from scott.emp
group by rollup(deptno)
;
DEPTNO TOTAL_SALARY
----------- ------------
10 8750
20 10875
30 9400
Grand Total 29025
grouping_id
也可用于控制行的顺序;例如,如果您希望总计位于顶部而不是底部,则可以order by grouping_id(deptno) desc, deptno
。
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions063.htm