Dus de eerste stap om te zien wat er gebeurt, is om de SOM's te verwijderen en gewoon het transactiebedrag en het claimbedrag te selecteren. Op die manier kunt u zien welke gegevens worden geretourneerd. U zult zien dat de join op A/2007 het transactiebedrag twee keer zal hebben, aangezien elke rij wordt toegevoegd aan de claimtabel.
Een oplossing is om subquery's te gebruiken, zoals je al zei, om de SOM's afzonderlijk te doen voordat je lid wordt.
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
Een andere mogelijke oplossing gezien uw beperkingen:
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
Derde mogelijke oplossing!! Deze vereist geen subquery's! Zie deze 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