Der erste Schritt, um zu sehen, was passiert, besteht darin, die SUMs zu entfernen und einfach den Transaktionsbetrag und den Anspruchsbetrag auszuwählen. Auf diese Weise können Sie sehen, welche Daten zurückgegeben werden. Sie werden sehen, dass die Verknüpfung auf A/2007 den Transaktionsbetrag zweimal enthält, da jede Zeile mit der Forderungstabelle verknüpft wird.
Eine Lösung besteht darin, wie Sie sagten, Unterabfragen zu verwenden, um die SUMs vor dem Beitritt separat durchzuführen.
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
Eine andere mögliche Lösung angesichts Ihrer Einschränkungen:
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
Dritte mögliche Lösung!! Dieser benötigt keine Unterabfragen! Siehe diese SQL Fiddle
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