Het gaat om een Cartesiaans product (waarbij rijen in de ene tabel worden vermenigvuldigd met de rijen in de andere tabellen). De veronderstelling die de volgende benadering maakt, is dat elk project een werklast heeft met toegewezen medewerkers (die allemaal verantwoordelijk zijn voor alle medewerkers aangezien uw zoekopdracht de join met de werknemerstabel niet laat zien) en taken. Als dit niet het geval is, overweeg dan om outer joins te doen versus de inner join.
Het idee is om elke aggregatie uit te voeren in een eigen afgeleide tabel op basis van projectnummer. We kunnen dan elke afgeleide tabel op projectnummer samenvoegen om zinvolle resultaten te verkrijgen.
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;