Het probleem kan zijn dat het gevolg is van een Cartesiaans resultaat van uw gegevens en sommaties. Ter verduidelijking, hier is een eenvoudige vraag... Ik weet dat ik niet alles heb, en ook niet perfect aansluit bij kolommen, dit is alleen ter verduidelijking.
IK WEET OOK dat ik de kolommen en aliassen heb afgekort voor een eenvoudigere lezing en begrip van het concept van wat u waarschijnlijk tegenkomt.
Select
t1.yr,
sum( t2.Amt ) as AmtChange
FROM
budget AS t1
LEFT JOIN Budget_Changes AS t2
on t1.yr = t2.Yr
Aan het einde, geen probleem... voor een bepaald jaar krijgt u de totalen van de tweede tabel. Tabel 2 bevat veel records. Bijvoorbeeld:Gegevens
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
Daar zijn we het op dit moment waarschijnlijk over eens... Gooi er nu nog een tabel bij die ook per jaar (of wat dan ook) meerdere records per jaar heeft...
Change_Orders
Yr COAmt
2013 100
2013 120
2014 200
2014 220
En je voegt dit toe als een secundaire left-join aan je zoekopdracht, zoiets als
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
Echter, aangezien het een Cartesiaans resultaat is... meerdere rijen per elke join krijgen de resultaten TIJDEN van elk item dat in de andere tabel bestaat... zoiets als
Yr AmtChange COChangeAmt
2013 120 440
2014 180 840
Om dit op te lossen, moet elke afzonderlijke tabel waarvan u subtotalen krijgt, op zichzelf worden afgehandeld en gegroepeerd op zijn eigen jaar, zodat de subset slechts één rij per gegevenscontext retourneert. Iets als
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
De subquery's zullen dus elk slechts 1 record voor het respectievelijke jaar retourneren dat wordt geaggregeerd en zo voorkomen dat het duplicaat in sum()-bedragen wordt gegenereerd.