2016-07-27 1 views
0

My Combine union et somme avec la colonne diffrent de vue

Je Voir ici

Ce que je veux essayer est de faire v_total_project ressemble à ça. J'essayer ce code

select o.id_project AS id_project, 
sum((o.office_expense + m.misc_expense)) AS total_expense 
from v_office_project o inner join v_misc_project m on o.id_project = m.id_project 
group by o.id_project, m.id_project 

Je sais que mon code ne sera pas imprimer la v_misc_project.id_project. J'ai donc essayé l'Union pour imprimer les deux id_project, et j'ai obtenu des numéros différents de colonne d'erreur.

select o.id_project AS id_project 
from v_office_project o 
union 
select m.id_project as id_project, 
sum((o.office_expense + m.misc_expense)) AS total_expense 
from v_office_project o inner join v_misc_project m on o.id_project = m.id_project 
group by id_project 

Alors, y a-t-il une autre façon de procéder? Merci à l'avance,

+1

mise en forme de fantaisie est préférable de laisser à votre code d'application. SQL est maladroit pour tel. –

Répondre

1
SELECT 
    o.id_project AS id_project, 
    sum(
     o.office_expense + ifnull(m.misc_expense, 0) 
    ) AS total_expense 
FROM 
    v_office_project o 
LEFT JOIN v_misc_project m ON o.id_project = m.id_project 
GROUP BY 
    id_project 
UNION 
    SELECT 
     m.id_project AS id_project, 
     sum(
      ifnull(o.office_expense, 0) + m.misc_expense 
     ) AS total_expense 
    FROM 
     v_office_project o 
    RIGHT JOIN v_misc_project m ON o.id_project = m.id_project 
    GROUP BY 
     id_project 

Dans la première sélection de votre syndicat vous manquez le terrain pour vos dépenses.

La jointure manquait également, ajouté. Au lieu de INNER JOIN utiliser un LEFT ou RIGHT Join, sinon vous obtenez uniquement des résultats pour id_project qui sont dans les deux tableaux.

Ajouté ifnull() dans le calcul, car le LEFT/RIGHT peut retourner null joint, qui doit être traité comme 0.