Donc, la première étape pour voir ce qui se passe est de supprimer les SUM et de sélectionner simplement le montant de la transaction et le montant de la réclamation. De cette façon, vous pouvez voir quelles données sont renvoyées. Vous verrez que la jointure sur A/2007 aura le montant de la transaction deux fois, puisqu'elle joint chaque ligne à la table des réclamations.
Une solution consiste à utiliser des sous-requêtes, comme vous l'avez dit, pour faire les SUM séparément avant de se joindre.
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
Autre solution possible compte tenu de vos restrictions :
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
Troisième solution possible !! Celui-ci ne nécessite aucune sous-requête ! Voir ce 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