Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Total Sum с изваждане, ако се направи нов запис в таблицата

Въз основа на 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Закръглете милисекунди на .NET DateTime, за да може да побере милисекунди на SQL Server

  2. SQL:анализирайте първото, средното и фамилното име от полето за пълно име

  3. Бърза помощ при използване на RANK върху множество променливи

  4. Как да поправя грешката „Доставчик на име Pipes, грешка 40 – Не можах да отворя връзка към „SQL Server“?

  5. Връщане на списък със схеми на дялове в SQL Server (T-SQL)