你可以做这样的事情。我没有您的输入数据,所以我
SCOTT.EMP改用了。
注意几件事。我按分组
JOB,并
GROUPING(JOB)在中使用
SELECt(
TOTAL为摘要行添加标签)和中
ORDERBY。由于我
JOB在
SELECT(输出列)中重用了列名,因此在
ORDERBYI中,我必须小心限定列名
JOB(为了清楚起见,我指的是输入表列,而不是指-中的列,
SELECT如果中的列名
ORDERBY不合格)。然后,需要对中的列名进行限定
ORDERBY,这迫使我在该
FROM子句中对该表进行别名化(否则,我将不得不在所有地方都携带完整的表名)。
如果可以的话,
GROUPING在中
SELECt(而不是
NVL)中使用函数特别重要。您不希望为工作组添加标签-
您只希望为汇总行添加标签。这一点甚至使很多非常高级的程序员感到困惑。
JOB``null``null``TOTAL
我展示了如何“手动”确定顺序:
PRESIDENT首先是,然后是
MANAGER,然后是所有其他作业(按字母顺序排列)。如果您将优先级顺序保存在某个地方(例如,在表中),则可以加入该表并使用排序列而不是
CASE查询中的“手动”表达式。
select case grouping(job) when 0 then job else 'TOTAL' end as job , sum(sal) as total_salaryfrom scott.emp egroup by rollup(job)order by grouping(e.job) -- to get the total in the last row , case e.job when 'PRESIDENT' then 1 when 'MANAGER' then 2 end , e.job;JOB TOTAL_SALARY--------- ------------PRESIDENT 5000MANAGER8275ANALYST6000CLERK 4150SALESMAN 5600TOTAL 29025



