Vấn đề có thể là do một kết quả Descartes của dữ liệu và tổng kết của bạn đang diễn ra. Chỉ để làm rõ, đây là một truy vấn đơn giản ... Tôi biết tôi không có tất cả, cũng như nối các cột hoàn hảo, điều này chỉ để làm rõ.
CŨNG THẾ, TÔI BIẾT Tôi đã viết tắt các cột và bí danh để đơn giản hóa việc đọc và hiểu khái niệm về những gì bạn có thể đang gặp phải.
Select
t1.yr,
sum( t2.Amt ) as AmtChange
FROM
budget AS t1
LEFT JOIN Budget_Changes AS t2
on t1.yr = t2.Yr
Cuối cùng, không vấn đề gì ... trong một năm nhất định, bạn sẽ nhận được tổng số từ bảng thứ hai. Có nhiều bản ghi trong bảng 2. Ví dụ:Dữ liệu
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
Chúng tôi có lẽ đồng ý về điều đó ở điểm này ... Bây giờ, hãy chuyển sang một bảng khác mà mỗi năm (hoặc bất cứ thứ gì), bảng đó cũng có nhiều bản ghi mỗi năm ...
Change_Orders
Yr COAmt
2013 100
2013 120
2014 200
2014 220
Và bạn thêm điều này vào dưới dạng kết hợp phụ bên trái vào truy vấn của mình, chẳng hạn như
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
Tuy nhiên, vì nó là kết quả Descartes ... nhiều hàng trên mỗi phép nối sẽ lấy kết quả LẦN mỗi mục nhập tồn tại trong bảng khác ... đại loại như
Yr AmtChange COChangeAmt
2013 120 440
2014 180 840
Để khắc phục điều này, mỗi bảng riêng lẻ mà bạn đang nhận tổng phụ phải được xử lý riêng và được nhóm theo năm của chính nó để tập hợp con chỉ trả về một hàng cho mỗi ngữ cảnh dữ liệu. Một cái gì đó giống như
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
Vì vậy, mỗi truy vấn phụ sẽ chỉ trả về 1 bản ghi cho năm tương ứng được tổng hợp và do đó ngăn chặn sự trùng lặp trong số tiền sum ().