Problemet kan skyldes, at et kartesisk resultat af dine data og summeringer foregår. Bare for at præcisere, her er en simpel forespørgsel... Jeg ved, at jeg ikke har det hele, og jeg kan heller ikke slutte mig til kolonner perfekt, dette er kun for afklaring.
JEG VED OGSÅ, at jeg har forkortet kolonnerne og aliasserne for at forenkle læsning og forståelse af begrebet, hvad du sandsynligvis støder på.
Select
t1.yr,
sum( t2.Amt ) as AmtChange
FROM
budget AS t1
LEFT JOIN Budget_Changes AS t2
on t1.yr = t2.Yr
I slutningen, intet problem... for et givet år vil du få totalerne fra den anden tabel. Der er mange poster i tabel 2. Eks:Data
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
Det er vi nok enige om på dette tidspunkt... Indsæt nu en anden tabel, der om året (eller hvad som helst), som også har flere rekorder om året...
Change_Orders
Yr COAmt
2013 100
2013 120
2014 200
2014 220
Og du tilføjer dette som et sekundært venstre-join til din forespørgsel, sådan noget som
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
Men da det er et kartesisk resultat... tager flere rækker pr. hver join resultaterne GANGE hver post, der findes i den anden tabel... noget i retning af
Yr AmtChange COChangeAmt
2013 120 440
2014 180 840
For at rette op på dette skal hver enkelt tabel, du får subtotaler fra, håndteres for sig selv og grupperes efter sit eget år, så delmængden kun returnerer én række pr. datakontekst. Noget lignende
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
Så underforespørgslerne returnerer hver kun 1 post for det respektive år, der aggregeres og forhindrer dermed duplikatet i sum()-beløb.