sql >> Base de Datos >  >> RDS >> Oracle

SQL:después de unir tablas, la función SUM () devuelve un valor incorrecto

El problema es un producto cartesiano (donde las filas de una tabla se multiplican por las filas de las otras tablas). La suposición que hace el siguiente enfoque es que cada proyecto tiene una carga de trabajo con empleados asignados (todos los cuales representan a todos los empleados ya que su consulta no muestra la unión a la tabla de empleados) y tareas. Si este no es el caso, considere hacer uniones externas en lugar de una unión interna.

La idea es realizar cada agregación en su propia tabla derivada según el número de proyecto. Luego podemos unir cada tabla derivada por número de proyecto para obtener 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;