Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL:Nach dem Verbinden von Tabellen gibt die SUM()-Funktion einen falschen Wert zurück

Es handelt sich um ein kartesisches Produkt (bei dem Zeilen in einer Tabelle mit den Zeilen in den anderen Tabellen multipliziert werden). Die Annahme, die der folgende Ansatz macht, ist, dass jedes Projekt eine Arbeitsbelastung mit zugewiesenen Mitarbeitern (die alle alle Mitarbeiter berücksichtigen, da Ihre Abfrage die Verknüpfung mit der Mitarbeitertabelle nicht anzeigt) und Aufgaben hat. Wenn dies nicht der Fall ist, ziehen Sie in Betracht, äußere Joins statt innerer Joins zu verwenden.

Die Idee ist, jede Aggregation in einer eigenen abgeleiteten Tabelle basierend auf der Projektnummer durchzuführen. Wir können dann jede abgeleitete Tabelle nach Projektnummer verknüpfen, um aussagekräftige Ergebnisse zu erhalten.

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;