sql >> Database >  >> RDS >> Sqlserver

SQL-totaalsom met aftrekking als nieuwe invoer in de tabel wordt gemaakt

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




  1. invoegen in... selecteer ... met subquery of zonder kolomvolgorde

  2. Fout tijdens installatie - Database-initialisatie mislukt

  3. Typen SQL Server-cursor - Alleen doorsturen dynamische cursor | SQL Server-zelfstudie / TSQL-zelfstudie

  4. Hoe vind je alle tabellen met externe sleutels die verwijzen naar bepaalde table.column en die waarden hebben voor die externe sleutels?