Vì vậy, bước đầu tiên để xem điều gì đang xảy ra là xóa SUM và chỉ chọn số tiền giao dịch và số tiền yêu cầu. Bằng cách đó, bạn có thể xem dữ liệu nào đang được trả về. Bạn sẽ thấy rằng lần tham gia vào A / 2007 sẽ có số tiền giao dịch gấp đôi, vì nó nối mỗi hàng với bảng xác nhận quyền sở hữu.
Một giải pháp là sử dụng các truy vấn con, như bạn đã nói, để thực hiện các SUM một cách riêng biệt trước khi tham gia.
SELECT
Transactions.Customer,
Transactions.Year,
SumTransaction,
SumClaim
FROM (
select Customer, Year, sum(Transaction Amount) SumTransaction
from Transactions
group by Customer, Year
) Transactions
LEFT JOIN (
select Customer, Year, sum(Claim Amount) sumClaim
from Claims
group by Customer, Year
) Claims
ON Claims.Customer = Transactions.Customer
AND Transactions.Year = Claims.Year
Một giải pháp khả thi khác do các hạn chế của bạn:
SELECT
Transactions.Customer,
Transactions.Year,
SUM(Transaction Amount),
(SELECT SUM(Claim Amount) from Claims where Claims.Customer = Transactions.Customer and Claims.Year = Transactions.Year)
FROM
Transactions
GROUP BY
Customer, Year
Giải pháp khả thi thứ ba !! Cái này không yêu cầu bất kỳ truy vấn phụ nào! Hãy xem SQL Fiddle này
select
t.Customer,
t.Year,
sum(distinct t.Amount),
sum(c.Amount)
from
Transactions t
left join Claims c
on t.Customer = c.Customer
and t.Year = c.year
group by
t.Customer,
t.Year