Problémem může být skutečnost způsobená kartézským výsledkem vašich dat a probíhajících sumací. Jen pro upřesnění, zde je jednoduchý dotaz... Vím, že nemám vše, ani spojování sloupců dokonalé, to je jen pro upřesnění.
TAKÉ VÍM, že jsem zkrátil sloupce a aliasy pro zjednodušené čtení a pochopení konceptu toho, s čím se pravděpodobně setkáváte.
Select
t1.yr,
sum( t2.Amt ) as AmtChange
FROM
budget AS t1
LEFT JOIN Budget_Changes AS t2
on t1.yr = t2.Yr
Na konci žádný problém... za daný rok získáte součty z druhé tabulky. V tabulce 2 je mnoho záznamů. Příklad: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
Na tom se v tuto chvíli pravděpodobně shodneme... Nyní přihoďte další tabulku, která za rok (nebo cokoli jiného) má také více záznamů za rok...
Change_Orders
Yr COAmt
2013 100
2013 120
2014 200
2014 220
A přidáte to jako sekundární levé spojení k vašemu dotazu, něco jako
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
Protože se však jedná o kartézský výsledek... více řádků na každé spojení bere výsledky KRÁTKY každý záznam, který existuje v druhé tabulce... něco jako
Yr AmtChange COChangeAmt
2013 120 440
2014 180 840
Chcete-li to vyřešit, každá jednotlivá tabulka, ze které získáváte mezisoučty, by měla být zpracována samostatně a seskupena podle vlastního roku, aby podmnožina vrátila pouze jeden řádek na kontext dat. Něco jako
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
Každý dílčí dotaz tedy vrátí pouze 1 záznam pro příslušný rok, který se agreguje, a zabrání tak duplicitě v sum() množství.