Masalahnya mungkin fakta karena hasil Cartesian dari data dan penjumlahan Anda terjadi. Hanya untuk memperjelas, ini adalah pertanyaan sederhana... Saya tahu saya tidak memiliki semuanya, atau menggabungkan kolom dengan sempurna, ini hanya untuk klarifikasi.
JUGA, SAYA TAHU Saya telah menyingkat kolom dan alias untuk menyederhanakan membaca dan memahami konsep dari apa yang mungkin Anda hadapi.
Select
t1.yr,
sum( t2.Amt ) as AmtChange
FROM
budget AS t1
LEFT JOIN Budget_Changes AS t2
on t1.yr = t2.Yr
Pada akhirnya, tidak masalah... untuk tahun tertentu, Anda akan mendapatkan total dari tabel kedua. Ada banyak record pada tabel 2. Contoh: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
Kami mungkin setuju pada saat ini... Sekarang, masukkan tabel lain bahwa per tahun (atau apa pun), itu juga memiliki banyak catatan per tahun...
Change_Orders
Yr COAmt
2013 100
2013 120
2014 200
2014 220
Dan Anda menambahkan ini sebagai gabungan kiri sekunder ke kueri Anda, seperti
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
Namun, karena ini adalah hasil Cartesian... beberapa baris per setiap gabungan mengambil hasil KALI setiap entri yang ada di tabel lain... sesuatu seperti
Yr AmtChange COChangeAmt
2013 120 440
2014 180 840
Untuk memperbaikinya, setiap tabel individu tempat Anda mendapatkan subtotal harus ditangani sendiri, dan dikelompokkan berdasarkan tahun sendiri sehingga subset hanya mengembalikan satu baris per konteks data. Sesuatu seperti
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
Jadi, sub-kueri masing-masing hanya akan mengembalikan 1 catatan untuk tahun terkait yang digabungkan dan dengan demikian mencegah duplikat dalam jumlah sum().