Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Total Sum z odejmowaniem, jeśli w tabeli zostanie wprowadzony nowy wpis

W oparciu o SQL Fiddle wykonałem nową próbę, która moim zdaniem jest poprawna, chociaż zwraca 81, a nie 100 dla 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

Założenie jest takie, że klient zawsze znajduje się w tabelach lojalnościowych, ale nie jest to konieczne w tabelach wykupów lub cen

SQL Fiddle dla tej wersji:http://sqlfiddle.com/#!3/5e379/8




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolumna tożsamości SQL Server 2000/2005 + replikacja

  2. Grupy dostępności programu SQL Server AlwaysOn:instalacja i konfiguracja, część 2

  3. Korzystanie z warunkowej instrukcji UPDATE w SQL

  4. Dlaczego instrukcja CREATE PROCEDURE kończy się niepowodzeniem, gdy używam jej z instrukcją IF tutaj?

  5. Pliki FILESTREAM pozostają po usunięciu wiersza