Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Resolução - analisar o salário médio por departamento

Boa noite!

SELECT
    DEPT.NOMEDEPARTAMENTO,
    (
        SELECT
            TO_CHAR(AVG(COL.SALARIO), 'L999G999G990D00', 'NLS_NUMERIC_CHARACTERS = '',.''')
        FROM
            COLABORADORES COL
        WHERE COL.ID_DEPARTAMENTO = DEPT.ID_DEPARTAMENTO
    ) AS SALÁRIO_MÉDIO
FROM
    DEPARTAMENTO DEPT
ORDER BY SALÁRIO_MÉDIO DESC;

Saída:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas
solução!

Olá, como vai?

Agradeço por compartilhar a sua resolução.

A sua consulta ficou bem construída para calcular o salário médio por departamento usando uma subconsulta correlacionada, já que a média é calculada para cada departamento com base na relação entre COL.ID_DEPARTAMENTO e DEPT.ID_DEPARTAMENTO. Também ficou interessante o uso do TO_CHAR() para formatar o resultado como valor monetário.

Você chegou a comparar o resultado ordenando por AVG(COL.SALARIO) antes da formatação?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Bom dia, Lorena!

Sim, a aplicação da ordenação (ORDER BY) antes da formatação também funciona:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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:

  1. ROLLUP(DEPT.NOMEDEPARTAMENTO): Forma agrupamentos por departamento e adiciona uma linha extra no final contendo a soma total.
  2. 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".
  3. 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:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade