sql >> Databáze >  >> RDS >> Sqlserver

SQL Celkový součet s odečtením, pokud je v tabulce proveden nový záznam

Na základě SQL Fiddle jsem provedl nový pokus, o kterém se domnívám, že je správný, ačkoli vrací 81 a ne 100 pro Johna:

;  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

Předpokladem je, že zákazník je vždy nalezen z věrnostních tabulek, ale není to nutné z tabulek vyplacení nebo cen

SQL Fiddle pro tuto verzi:http://sqlfiddle.com/#!3/5e379/8




  1. Jak vybrat seskupené řádky pouze s hodnotami NULL?

  2. Existuje SQL Server Profiler pro SQL Server Express?

  3. Co by měl vědět každý PHP programátor?

  4. Hierarchická SQL otázka