2017-10-16 22 views
1

J'ai une table de bon de travail avec 3 tables connexes pour le travail, l'équipement et les matériaux. J'essaie d'additionner le coût pour les 3 articles et le groupe par WorkOrderID. Je sais qu'une jointure directe va multiplier tous les résultats, donc j'ai besoin d'utiliser des sous-requêtes, mais je n'arrive pas à comprendre comment écrire les sous-requêtes.Total des totaux à partir de 3 tables liées à la table parente - SQL

Voici la requête de jointure droite brisée. J'ai essayé quelques sous-requêtes et continue à obtenir des résultats multipliés. Toute aide est grandement appréciée. Je vous remercie.

select wo.workorderid, sum(lab.cost) as labcost, sum(mat.cost) as matCost, sum(eq.cost) as eqcost 
from WORKORDER as wo 
    join LABORCOSTACT as lab 
on lab.WORKORDERID = wo.WORKORDERID 
    join MATERIALCOSTACT as mat 
on mat.WORKORDERID = wo.WORKORDERID 
    join EQUIPMENTCOSTACT as eq 
on eq.WORKORDERID = wo.WORKORDERID 
where lab.TASKNAME like 'tree_rmvl' 
group by wo.WORKORDERID 
order by wo.WORKORDERID 
+0

Quel SGBD utilisez-vous? SQL est juste un langage de requête et non le nom d'un produit de base de données spécifique –

+2

Exemple de données. Les résultats souhaités. –

Répondre

0

si vous voulez éviter les doubles emplois vous pouvez rejoindre le résultat aggreated du chaque groupe de table par la clé pour se joindre à la table principale

select wo.workorderid, lab.tot_lab_cost as labcost, mat.tot_mat_cost as matCost, eq.tot_eq_cost) as eqcost 
from WORKORDER as wo 
    inner join ( 
     select WORKORDERID , sum(cost) tot_lab_cost 
     from LABORCOSTACT 
     group by WORKORDERID 
    ) lab on lab.WORKORDERID = wo.WORKORDERID 
    inner join (
     select WORKORDERID , sum(cost) tot_mat_cost 
     from MATERIALCOSTACT 
     group by WORKORDERID 
    ) mat on mat.WORKORDERID = wo.WORKORDERID 
    inner join (
     select WORKORDERID , sum(cost) tot_eq_cost 
     from EQUIPMENTCOSTACT 
     group by WORKORDERID 
    ) eq on eq.WORKORDERID = wo.WORKORDERID 
where lab.TASKNAME like 'tree_rmvl' 
order by wo.WORKORDERID