Op basis van de SQL Fiddle heb ik een nieuwe poging gedaan, die volgens mij correct is, hoewel het 81 en niet 100 voor John retourneert:
; with LP (CustomerId, Name, UserActions, TotalPoints) as (
SELECT
C.CustomerId,
C.Name,
sum(case when P.LoyaltyPointsId = 4 then isnull(R.RedeemCount, 0) else 1 end),
sum(P.Points * case when P.LoyaltyPointsId = 4 then isnull(R.RedeemAmount,0) else 1 end)
from
CustomerTable C
join LoyaltyDetailsTable D on D.CustomerId = C.CustomerId
join LoyaltyPointTable P on P.LoyaltyPointsId = D.LoyaltyPointsId
outer apply (
select sum(Amount) as RedeemAmount, count(Amount) as RedeemCount
from RedeemPointsTable R
where R.CustomerId = C.CustomerId
) R
group by C.CustomerId, C.Name
),
PP (CustomerId, Pricepoints) as (
select C.CustomerId, sum(P.Pricepoints)
from PriceTable P
join PriceClaimTable C on P.PriceClaimId = C.PriceClaimId
group by C.CustomerId
)
select
LP.CustomerId, LP.Name, LP.UserActions, LP.TotalPoints - isnull(PP.Pricepoints, 0) as Points
from
LP
left outer join PP on LP.CustomerId = PP.CustomerId
order by LP.CustomerId
Aanname is dat de klant altijd gevonden wordt vanuit de loyaliteitstabellen, maar niet noodzakelijk vanuit verzilver- of prijstabellen
SQL Fiddle voor deze versie:http://sqlfiddle.com/#!3/5e379/8