Bom dia, Lorena!
Sim, a aplicação da ordenação (ORDER BY) antes da formatação também funciona:
Adicionalmente, apesar de o banco de dados de exemplo ter somente um funcionário em cada departamento, para uma base com muitos registros, penso que além da relevância seria útil agregar mais elementos informativos para uma boa análise financeira, como feito a seguir:
SELECT
-- Se o nome do departamento for nulo (gerado pelo ROLLUP), exibe 'TOTAL GERAL'
NVL(DEPT.NOMEDEPARTAMENTO, 'TOTAL GERAL') AS NOMEDEPARTAMENTO,
COUNT(COL.ID_COLABORADOR) AS QUANTIDADE_FUNCIONÁRIOS,
TO_CHAR(AVG(COL.SALARIO), 'L999G999G990D00', 'NLS_NUMERIC_CHARACTERS = '',.''') AS MÉDIA_SALARIAL,
TO_CHAR(SUM(COL.SALARIO), 'L999G999G990D00', 'NLS_NUMERIC_CHARACTERS = '',.''') AS TOTAL_FOLHA,
-- Mantém o percentual calculando sobre o total geral
ROUND(
(SUM(COL.SALARIO) / SUM(SUM(COL.SALARIO)) OVER(PARTITION BY GROUPING(DEPT.NOMEDEPARTAMENTO))) * 100,
2
) AS "%"
FROM
DEPARTAMENTO DEPT
LEFT JOIN
COLABORADORES COL ON DEPT.ID_DEPARTAMENTO = COL.ID_DEPARTAMENTO
GROUP BY
ROLLUP(DEPT.NOMEDEPARTAMENTO);
Alguns esclarecimentos sobre o comando acima, aplicáveis ao Oracle:
- ROLLUP(DEPT.NOMEDEPARTAMENTO): Forma agrupamentos por departamento e adiciona uma linha extra no final contendo a soma total.
- NVL(..., 'TOTAL GERAL'): Na linha do total geral, o Oracle deixa a coluna do agrupamento como NULL. A função NVL serve para substituir esse nulo pelo texto "TOTAL GERAL".
- PARTITION BY GROUPING(...): Ajuste necessário na função analítica para que a linha do total geral exiba 100% corretamente, em vez de dar erro de cálculo ou divisões incorretas devido ao subtotal do ROLLUP.
Saída: