問題は、データと合計のデカルト結果が原因である可能性があります。明確にするために、ここに簡単なクエリがあります...私はそれをすべて持っているわけではなく、列を完全に結合するわけでもありません。これは明確にするためだけのものです。
また、おそらく遭遇しているものの概念を読みやすく理解しやすくするために、列とエイリアスを省略していることも知っています。
Select
t1.yr,
sum( t2.Amt ) as AmtChange
FROM
budget AS t1
LEFT JOIN Budget_Changes AS t2
on t1.yr = t2.Yr
最後に、問題ありません...特定の年について、2番目のテーブルから合計を取得します。表2には多くのレコードがあります。例:データ
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
この時点でおそらく同意するでしょう...さて、年ごとに(または何でも)、年ごとに複数のレコードがある別のテーブルを投入します...
Change_Orders
Yr COAmt
2013 100
2013 120
2014 200
2014 220
そして、これをセカンダリの左結合としてクエリに追加します。たとえば、
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
ただし、これはデカルトの結果であるため、各結合ごとに複数の行が、他のテーブルに存在する各エントリの結果をTIMES取得しています...のようなものです
Yr AmtChange COChangeAmt
2013 120 440
2014 180 840
これを修正するには、小計を取得する個々のテーブルを個別に処理し、独自の年でグループ化して、サブセットがデータのコンテキストごとに1行のみを返すようにする必要があります。のようなもの
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
したがって、サブクエリはそれぞれ、集計されたそれぞれの年の1つのレコードのみを返すため、sum()の金額の重複を防ぐことができます。