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

विशिष्ट मान के बराबर विशिष्ट कॉलम के योग द्वारा समूह पंक्ति

कुल गणना के साथ स्रोत तालिका पर लगाए गए "देय" सीमाओं को परिभाषित करने वाली एक सहायक तालिका के साथ, "देय" सीमाओं के साथ प्रत्येक चल रही कुल राशि का एक चौराहे की गणना की जा सकती है:

With Receipt As ( --< Sample source table
    Select * From (Values
        ('R1', 100),
        ('R2', 100),
        ('R3',  70),
        ('R4',  50),
        ('R5', 200)
    ) V (ReceiptNo, Amount)
), ReceiptWithTotal As ( --< Source table with Running Totals calculated
    Select *,
        SUM(Amount) Over (Order By ReceiptNo Rows Unbounded Preceding) - Amount As RunningTotalBefore,
        SUM(Amount) Over (Order By ReceiptNo Rows Unbounded Preceding) As RunningTotalAfter
    From Receipt
), Due As ( --< Helper table to define intervals (can be generated dynamically to cover any Total)
    Select * From (Values
        ('D1',   0, 100),
        ('D2', 100, 200),
        ('D3', 200, 300),
        ('D4', 300, 400),
        ('D5', 400, 500),
        ('D6', 500, 600)
    ) V (DueNo, AmountLow, AmountHigh)
)
Select DueNo, ReceiptNo,
    IIF(AmountHigh < RunningTotalAfter, AmountHigh, RunningTotalAfter) -
    IIF(AmountLow > RunningTotalBefore, AmountLow, RunningTotalBefore) As Amount
From Due
Inner Join ReceiptWithTotal On NOT (RunningTotalAfter <= AmountLow OR RunningTotalBefore >= AmountHigh)

कृपया ध्यान दें:SUM(...) Over (Order By ... Rows Unbounded Preceding) और IIF(...) केवल SQL सर्वर 2012+ पर उपलब्ध हैं। SQL सर्वर 2008 पर उप-क्वेरी के माध्यम से भी ऐसा ही किया जा सकता है, हालांकि बहुत कम कुशल:

With Receipt As ( --< Sample source table
    Select * From (Values
        ('R1', 100),
        ('R2', 100),
        ('R3',  70),
        ('R4',  50),
        ('R5', 200)
    ) V (ReceiptNo, Amount)
), ReceiptWithTotal As ( --< Source table with Running Totals calculated
    Select *, RunningTotalAfter - Amount As RunningTotalBefore
    From (
        Select *,
            (Select SUM(Amount) From Receipt B Where B.ReceiptNo <= A.ReceiptNo) As RunningTotalAfter
        From Receipt A
    ) A
), Due As ( --< Helper table to define intervals (can be generated dynamically to cover any Total)
    Select * From (Values
        ('D1',   0, 100),
        ('D2', 100, 200),
        ('D3', 200, 300),
        ('D4', 300, 400),
        ('D5', 400, 500),
        ('D6', 500, 600)
    ) V (DueNo, AmountLow, AmountHigh)
)
Select DueNo, ReceiptNo,
    CASE WHEN AmountHigh < RunningTotalAfter THEN AmountHigh ELSE RunningTotalAfter END -
    CASE WHEN AmountLow > RunningTotalBefore THEN AmountLow ELSE RunningTotalBefore END As Amount
From Due
Inner Join ReceiptWithTotal On NOT (RunningTotalAfter <= AmountLow OR RunningTotalBefore >= AmountHigh)



  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 Server 2008 में एक समग्र विदेशी कुंजी बनाना

  3. SQL सर्वर अस्थायी वस्तु कैशिंग

  4. मैं कुछ ऐसा कैसे कर सकता हूं:USE @databaseName

  5. स्ट्रिंग को हेक्स में कैसे बदलें और इसके विपरीत?