Въз основа на SQL Fiddle направих нов опит, който според мен е правилен, въпреки че връща 81, а не 100 за Джон:
<предварителен код>; с LP (CustomerId, Name, UserActions, TotalPoints) като (SELECT C.CustomerId, C.Name, sum(случай, когато P.LoyaltyPointsId =4 тогава е нула(R.RedeemCount, 0) else 1 end), sum(P.Points * случай, когато P.LoyaltyPointsId =4 тогава isnull(R.RedeemAmount,0) else 1 край)от CustomerTable C присъединяване LoyaltyDetailsTable D към D.CustomerId =C.CustomerId присъединяване към LoyaltyPointTable P към P.LoyaltyPointsId =D.LoyaltyPointsId външно прилагане ( изберете sum(Amount) като RedeemAmount, count(Amount) като RedeemCount от RedeemPointsTable R където R.CustomerId =C.CustomerId ) R група по C.CustomerId, C.Name),PP (CustomerId, Pricepoints) като ( изберете C.CustomerId, sum(P.Pricepoints) от PriceTable P присъединете PriceClaimTable C към P.PriceClaimId =C.PriceClaimId група от C.CustomerId) изберете LP.CustomerId, LP.Name, LP.UserActions, LP.TotalPoints - isnull(PP.Pricepoints, 0 ) като Точки от LP ляво външно съединяване PP на LP.CustomerId =PP.CustomerId поръчка по LP.CustomerIdПредполага се, че клиентът винаги се намира от таблиците за лоялност, но не е необходимо от таблиците за осребряване или цените
SQL Fiddle за тази версия:http://sqlfiddle.com/#!3/5e379/8