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

SQL:Depois de juntar as tabelas, a função SUM() retorna o valor errado


Em causa está um produto cartesiano (onde as linhas de uma tabela estão sendo multiplicadas pelas linhas das outras tabelas). A suposição que a abordagem a seguir está fazendo é que cada projeto tem uma carga de trabalho com funcionários atribuídos (todos os quais representam todos os funcionários, pois sua consulta não mostra a associação à tabela de funcionários) e tarefas. Se esse não for o caso, considere fazer junções externas versus a junção interna.

A ideia é realizar cada agregação em sua própria tabela derivada com base no número do projeto. Podemos então unir cada tabela derivada pelo número do projeto para obter resultados significativos.
SELECT
p.NAME,
w.workload_sum AS "Total Workload",
e.employee_count AS "Total Employees",
t.task_count AS "Finished Tasks"
from p 
JOIN (select pno, sum(workload) as workload_sum
        from w
       group by pno) w ON (w.pno=p.pnumber)
JOIN (select pno, count(distinct w.essn) as employee_count
        from w
       group by pno) e ON (e.pno=p.pnumber)
JOIN (select pno, count(distinct t.name) as task_count
        from t
       group by pno) t ON (t.pno=p.pnumber)
WHERE t.END_DATE is NOT NULL;