Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

यदि तालिका में नई प्रविष्टि की जाती है तो घटाव के साथ SQL कुल योग

SQL Fiddle के आधार पर, मैंने एक नया प्रयास किया, जो मुझे लगता है कि सही है, हालांकि यह जॉन के लिए 81 और 100 नहीं लौटाता है:

;  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

माना जाता है कि ग्राहक हमेशा लॉयल्टी टेबल से पाया जाता है, लेकिन रिडीम या प्राइस टेबल से जरूरी नहीं है

इस संस्करण के लिए 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. दिनांकित परिणाम का योग प्राप्त करना

  2. SQL एजेंट सेवा का सेवा खाता विवरण प्राप्त करें

  3. INNER JOIN करते समय डुप्लीकेट परिणाम

  4. DB की सभी तालिकाओं, पंक्तियों और स्तंभों में एक स्ट्रिंग खोजें

  5. READ UNCOMMITTED आइसोलेशन स्तर का उपयोग क्यों करें?