Oracle
 sql >> Database >  >> RDS >> Oracle

SQL:dopo aver unito le tabelle, la funzione SUM() restituisce un valore errato

Si tratta di un prodotto cartesiano (in cui le righe di una tabella vengono moltiplicate per le righe delle altre tabelle). Il presupposto del seguente approccio è che ogni progetto ha un carico di lavoro con dipendenti assegnati (che rappresentano tutti i dipendenti poiché la query non mostra il join alla tabella dipendenti) e attività. In caso contrario, considera la possibilità di eseguire gli outer join rispetto all'internal join.

L'idea è di eseguire ogni aggregazione nella propria tabella derivata in base al numero di progetto. Possiamo quindi unire ogni tabella derivata per numero di progetto per ottenere risultati significativi.

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;