Le problème est un produit cartésien (où les lignes d'une table sont multipliées par les lignes des autres tables). L'hypothèse que l'approche suivante fait est que chaque projet a une charge de travail avec des employés affectés (qui représentent tous tous les employés puisque votre requête ne montre pas la jointure à la table des employés) et des tâches. Si ce n'est pas le cas, envisagez de faire des jointures externes plutôt que des jointures internes.
L'idée est d'effectuer chaque agrégation dans sa propre table dérivée en fonction du numéro de projet. Nous pouvons ensuite joindre chaque table dérivée par numéro de projet pour obtenir des résultats significatifs.
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;