Você poderia fazer algo assim. Não tenho seus dados de entrada, então usei
SCOTT.EMP
em vez de. Observe algumas coisas. Agrupei por
JOB
, e usei GROUPING(JOB)
ambos em SELECT
(para adicionar o rótulo TOTAL
para a linha de resumo) e em ORDER BY
. Como reutilizo o nome da coluna JOB
em SELECT
(para a coluna de saída), em ORDER BY
Devo ter cuidado para qualificar o nome da coluna JOB
(para deixar claro, estou me referindo à coluna da tabela de entrada, não à coluna em SELECT
- que seria o padrão se os nomes das colunas em ORDER BY
não foram qualificados). A necessidade de qualificar os nomes das colunas em ORDER BY
, então, me forçou a alias da tabela no FROM
cláusula (caso contrário, eu teria que carregar o nome completo da tabela em todos os lugares). Usando o
GROUPING
função em SELECT
(em vez de NVL
) é particularmente importante se JOB
pode ser null
. Você não quer o grupo para null
trabalho a ser rotulado como TOTAL
- você só quer isso para a linha de rollup. Este ponto confunde até mesmo muitos programadores muito avançados. Eu mostro como você pode decidir "manualmente" o pedido:
PRESIDENT
primeiro, depois MANAGER
e, em seguida, todos os outros trabalhos (ordenados alfabeticamente). Se você tiver a ordem de prioridade salva em algum lugar, por exemplo, em uma tabela, você pode juntar-se a essa tabela e usar a coluna de ordenação em vez do "manual" CASE
expressão na minha consulta. select case grouping(job) when 0 then job else 'TOTAL' end as job
, sum(sal) as total_salary
from scott.emp e
group 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 5000
MANAGER 8275
ANALYST 6000
CLERK 4150
SALESMAN 5600
TOTAL 29025