Oracle GROUPING类型小计的替代格式?

时间:2018-02-23 16:26:29

标签: oracle formatting grouping

典型的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不喜欢做的事情?

1 个答案:

答案 0 :(得分:2)

您可以使用GROUPING_IDCASE表达式来控制总行中显示的内容。例如:

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