Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

sql order by com uma cláusula de seleção interna e group by rollup


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