Il problema potrebbe essere dovuto a un risultato cartesiano dei dati e delle sommatorie in corso. Giusto per chiarire, ecco una semplice domanda... So di non avere tutto, né unire colonne perfette, questo è solo per chiarimento.
INOLTRE, SO di aver abbreviato le colonne e gli alias per semplificare la lettura e la comprensione del concetto di ciò che probabilmente stai incontrando.
Select
t1.yr,
sum( t2.Amt ) as AmtChange
FROM
budget AS t1
LEFT JOIN Budget_Changes AS t2
on t1.yr = t2.Yr
Alla fine, nessun problema... per un dato anno, otterrai i totali dalla seconda tabella. Ci sono molti record nella tabella 2. Es:Dati
Budget
Yr
2013
2014
Budget_Changes
Yr Amt
2013 10
2013 20
2013 30
2014 40
2014 50
Your results would be
Yr AmtChange
2013 60
2014 90
Probabilmente siamo d'accordo su questo a questo punto... Ora, aggiungi un'altra tabella che all'anno (o qualsiasi altra cosa), anche quella ha più record all'anno...
Change_Orders
Yr COAmt
2013 100
2013 120
2014 200
2014 220
E lo aggiungi come join sinistro secondario alla tua query, qualcosa come
Select
t1.yr,
sum( t2.Amt ) as AmtChange,
sum( t3.COAmt ) as COAmtChange
FROM
budget AS t1
LEFT JOIN Budget_Changes AS t2
on t1.yr = t2.Yr
LEFT JOIN Change_Orders AS t3
on t1.yr = t3.Yr
Your might expect the results to be
Yr AmtChange COChangeAmt
2013 60 220
2014 90 420
Tuttavia, poiché si tratta di un risultato cartesiano... più righe per ogni join stanno prendendo i risultati VOLTE ogni voce che esiste nell'altra tabella... qualcosa come
Yr AmtChange COChangeAmt
2013 120 440
2014 180 840
Per risolvere questo problema, ogni singola tabella da cui stai ricevendo i totali parziali deve essere gestita da sola e raggruppata in base al proprio anno in modo che il sottoinsieme restituisca solo una riga per contesto di dati. Qualcosa come
Select
t1.yr,
t2.AmtChange,
t3.COAmtChange
FROM
budget AS t1
LEFT JOIN ( select BC.Yr, sum( BC.Amt ) as AmtChange
from Budget_Changes BC
group by BC.Yr ) t2
on t1.yr = t2.Yr
LEFT JOIN ( select CO.Yr, sum( CO.COAmt ) as COAmtChange
from Change_Orders CO
group by CO.Yr ) AS t3
on t1.yr = t3.Yr
Pertanto, le sottoquery restituiranno ciascuna solo 1 record per il rispettivo anno da aggregare e quindi impediranno il duplicato in importi sum().