2016-01-29 191 views
1

提前道歉解釋。任何幫助,將不勝感激。FIFO庫存老化

我們有如下表:

enter image description here

此表包含6桶:

  • 360:資產或負債在360天以上
  • 181舉行 - 360:資產或負債在181 - 360日之間持有
  • 91 - 180:91 - 180日之間持有的資產或負債
  • 61 - 90:61之間保持資產或負債 - 90天
  • 31 - 60:31之間保持資產或負債 - 60天
  • = < 30:資產或負債保持30天或更少

我們要應用下面的邏輯來得到結果如下圖所示:

enter image description here

的邏輯如下:

  • 從列360開始,從資產中減去負債。
  • 如果結果是負債,我們有資產留在下面的桶中,那麼從下面的欄中減去資產等等,直到我們通過所有資產桶或者我們有0桶資產和負債。
  • 如果結果是一項資產,而且我們有剩餘的負債存在於較低的存貨桶中,那麼從其中減去下一列的負債,等等,直到我們通過所有資產桶或者我們有該存貨桶的0資產和負債。
  • 如果我們設法完全清除剩餘的資產或負債,並且仍然存在來自較低存儲桶的一些資產或債務,那麼當我們從較高存儲桶(91-180)減去較低存儲桶(31-60)時,較低的桶將成爲剩餘部分,並將用於評估下一個桶。 (見下面的例子爲這種情況)

這樣設定:

enter image description here

將變爲:

enter image description here

我試圖避免使用循環和希望用遊標而不是遊標來實現這一點。我自己有幾個去做,但不能完全得到我需要的結果。 This article幫助但不是我所需要的。

腳本生成測試數據:

CREATE TABLE #LINE ([Cusip] VARCHAR(32), 
        [TradingActivity] VARCHAR(10), 
        [NotionalAmount] DECIMAL (20,2), 
        [TradeDate] DATE, 
        [ValDate] DATE) 

INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-01-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-01-12','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-07-10','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-10-08','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-11-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-12-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-01-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-01-12','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-07-10','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-10-08','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-11-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-12-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0002','BUY','2000000.00','2015-01-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0002','SELL','1000000.00','2015-01-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0003','SELL','2000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0003','BUY','1000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0004','BUY','1000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0004','SELL','2000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0005','SELL','1000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0005','BUY','2000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0006','BUY','1000000.00','2015-11-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0006','SELL','1000000.00','2015-11-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0007','SELL','2000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0007','BUY','2000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0008','SELL','1000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0008','BUY','2000000.00','2015-01-08','2016-01-07') 
INSERT INTO #LINE VALUES('T0009','BUY','1000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0009','SELL','2000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0010','SELL','2000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0010','BUY','1000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0011','BUY','2000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0011','SELL','1000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0012','SELL','1000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0012','BUY','1000000.00','2015-11-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0013','SELL','2000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0013','BUY','2000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0014','SELL','2000000.00','2015-12-03','2016-01-07') 
INSERT INTO #LINE VALUES('T0014','BUY','1000000.00','2015-01-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0014','SELL','2000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0014','BUY','2000000.00','2015-10-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0015B','SELL','1000000.00','2015-12-03','2016-01-07') 
INSERT INTO #LINE VALUES('T0015A','BUY','4000000.00','2015-04-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0015A','SELL','3000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0015B','BUY','2000000.00','2015-10-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0016B','SELL','2000000.00','2015-12-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0016A','BUY','3000000.00','2015-04-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0016A','SELL','4000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0016B','BUY','1000000.00','2015-10-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0017A','SELL','3000000.00','2015-12-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0017B','SELL','2000000.00','2015-12-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0017A','BUY','4000000.00','2015-10-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0017B','BUY','1000000.00','2015-10-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0018B','SELL','2000000.00','2015-12-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0018A','BUY','4000000.00','2015-04-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0018B','BUY','1000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0018A','SELL','3000000.00','2015-10-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0019B','BUY','8000000.00','2015-12-03','2016-01-07') 
INSERT INTO #LINE VALUES('T0019A','SELL','1000000.00','2015-01-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0019B','BUY','5000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0019A','SELL','7000000.00','2015-09-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0020B','SELL','8000000.00','2015-12-03','2016-01-07') 
INSERT INTO #LINE VALUES('T0020A','SELL','1000000.00','2015-01-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0020B','BUY','5000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0020A','BUY','7000000.00','2015-09-02','2016-01-07') 
+0

我認爲你需要做一些工作,而不是在這裏定義你的業務邏輯...... – JonH

+0

你的解釋很不錯,但有點混亂,你可以用樣本數據重現那些步驟,以便我們更好地理解它? –

+2

這聽起來像是在FIFO基礎上消耗庫存的變化。 [This](http://stackoverflow.com/questions/9420173/sql-subtracting-a-depleting-value-from-rows/9421009#9421009)答案可能會提供一些提示。 – HABO

回答

0

一些試驗後和錯誤這個實現是給我想要的結果:

CREATE TABLE #LINE ([Cusip] VARCHAR(32), 
        [TradingActivity] VARCHAR(10), 
        [NotionalAmount] DECIMAL (20,2), 
        [TradeDate] DATE, 
        [ValDate] DATE) 

INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-01-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-01-12','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-07-10','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-10-08','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-11-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-12-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_A','BUY','1000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-01-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-01-12','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-07-10','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-10-08','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-11-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-12-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0001_B','SELL','1000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0002','BUY','2000000.00','2015-01-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0002','SELL','1000000.00','2015-01-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0003','SELL','2000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0003','BUY','1000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0004','BUY','1000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0004','SELL','2000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0005','SELL','1000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0005','BUY','2000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0006','BUY','1000000.00','2015-11-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0006','SELL','1000000.00','2015-11-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0007','SELL','2000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0007','BUY','2000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0008','SELL','1000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0008','BUY','2000000.00','2015-01-08','2016-01-07') 
INSERT INTO #LINE VALUES('T0009','BUY','1000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0009','SELL','2000000.00','2015-07-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0010','SELL','2000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0010','BUY','1000000.00','2015-10-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0011','BUY','2000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0011','SELL','1000000.00','2015-11-06','2016-01-07') 
INSERT INTO #LINE VALUES('T0012','SELL','1000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0012','BUY','1000000.00','2015-11-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0013','SELL','2000000.00','2015-12-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0013','BUY','2000000.00','2016-01-07','2016-01-07') 
INSERT INTO #LINE VALUES('T0014','SELL','2000000.00','2015-12-03','2016-01-07') 
INSERT INTO #LINE VALUES('T0014','BUY','1000000.00','2015-01-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0014','SELL','2000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0014','BUY','2000000.00','2015-10-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0015B','SELL','1000000.00','2015-12-03','2016-01-07') 
INSERT INTO #LINE VALUES('T0015A','BUY','4000000.00','2015-04-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0015A','SELL','3000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0015B','BUY','2000000.00','2015-10-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0016B','SELL','2000000.00','2015-12-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0016A','BUY','3000000.00','2015-04-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0016A','SELL','4000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0016B','BUY','1000000.00','2015-10-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0017A','SELL','3000000.00','2015-12-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0017B','SELL','2000000.00','2015-12-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0017A','BUY','4000000.00','2015-10-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0017B','BUY','1000000.00','2015-10-09','2016-01-07') 
INSERT INTO #LINE VALUES('T0018B','SELL','2000000.00','2015-12-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0018A','BUY','4000000.00','2015-04-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0018B','BUY','1000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0018A','SELL','3000000.00','2015-10-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0019B','BUY','8000000.00','2015-12-03','2016-01-07') 
INSERT INTO #LINE VALUES('T0019A','SELL','1000000.00','2015-01-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0019B','BUY','5000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0019A','SELL','7000000.00','2015-09-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0020B','SELL','8000000.00','2015-12-03','2016-01-07') 
INSERT INTO #LINE VALUES('T0020A','SELL','1000000.00','2015-01-01','2016-01-07') 
INSERT INTO #LINE VALUES('T0020B','BUY','5000000.00','2015-07-02','2016-01-07') 
INSERT INTO #LINE VALUES('T0020A','BUY','7000000.00','2015-09-02','2016-01-07') 

-- Assign LOT numbers to each record based on CUSIP, TradingActivity, and Bucket. And assign rankings to the buckets used for ordering later on. 
IF OBJECT_ID('tempdb..#RollUp') IS NOT NULL 
    DROP TABLE #RollUp; 

     SELECT A.[Cusip], 
      A.[TradingActivity], 
      A.[NotionalAmount], 
      [LOT] =ROW_NUMBER() OVER (PARTITION BY A.[Cusip],A.[TradingActivity],CASE WHEN DATEDIFF(day,A.[TradeDate],A.[ValDate]) BETWEEN 0 AND 30 THEN '0' --'[=<30]' 
       WHEN DATEDIFF(day,A.[TradeDate],A.[ValDate]) BETWEEN 31 AND 60 THEN '1' --'[31-60]' 
       WHEN DATEDIFF(day,A.[TradeDate],A.[ValDate]) BETWEEN 61 AND 90 THEN '2' --'[61-90]' 
       WHEN DATEDIFF(day,A.[TradeDate],A.[ValDate]) BETWEEN 91 AND 180 THEN '3' --'[91-180]' 
       WHEN DATEDIFF(day,A.[TradeDate],A.[ValDate]) BETWEEN 181 AND 360 THEN '4' --'[181-360]' 
       WHEN DATEDIFF(day,A.[TradeDate],A.[ValDate]) > 360 THEN '5' --'[+360]' 
       END ORDER BY A.[TradeDate]) 
      , 
      [Bucket]= CASE WHEN DATEDIFF(day,[TradeDate],[ValDate]) BETWEEN 0 AND 30 THEN '0' --'[=<30]' 
       WHEN DATEDIFF(day,[TradeDate],[ValDate]) BETWEEN 31 AND 60 THEN '1' --'[31-60]' 
       WHEN DATEDIFF(day,[TradeDate],[ValDate]) BETWEEN 61 AND 90 THEN '2' --'[61-90]' 
       WHEN DATEDIFF(day,[TradeDate],[ValDate]) BETWEEN 91 AND 180 THEN '3' --'[91-180]' 
       WHEN DATEDIFF(day,[TradeDate],[ValDate]) BETWEEN 181 AND 360 THEN '4' --'[181-360]' 
       WHEN DATEDIFF(day,[TradeDate],[ValDate]) > 360 THEN '5' --'[+360]' 
       END INTO #RollUp 
     FROM #Line AS A 
     ORDER BY [Cusip],[TradeDate] 

-- Apply (+/-) sign to NotionalAmount and derive the SUM of NotionalAmount based on CUSIP, TradingActivity, and Bucket 
IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL 
    DROP TABLE #TEMP; 

     SELECT A.[Cusip], 
      A.[Bucket], 
      A.[LOT], 
      A.[NotionalAmount], 
      [SignedNotionalAmount] = CASE WHEN A.[TradingActivity] = 'BUY' THEN A.[NotionalAmount] ELSE 0-A.[NotionalAmount] END, 
      A.[TradingActivity], 
      [SumNotionalAmount] = SUM(A.[NotionalAmount])OVER(PARTITION BY A.[Cusip],A.[TradingActivity], A.[Bucket]) INTO #TEMP  
     FROM #RollUp AS A  
     ORDER BY A.[Bucket] DESC, 
       A.[LOT] ASC 

-- Rank the notional ammounts for each CUSIP based on TradeActivity 
IF OBJECT_ID('tempdb..#TEMP2') IS NOT NULL 
    DROP TABLE #TEMP2; 

     SELECT A.[Cusip], 
      A.[Bucket], 
      [SumNotionalAmount] = SUM(A.[SignedNotionalAmount]), 
      [SignedNotionalAmountRanked] = RANK() OVER(PARTITION BY A.[Cusip],CASE WHEN SUM(A.[SignedNotionalAmount]) > 0 THEN 'BUY' 
                   ELSE 'SELL' END 
               ORDER BY A.Bucket DESC) INTO #TEMP2 
     FROM #TEMP AS A 
     GROUP BY A.[Cusip], 
       A.[Bucket] 


-- Calculate Sum of the Notional amount based on FIFO algorithm at CUSIP level and place in correct bucket(s) 
IF OBJECT_ID('tempdb..#TEMP3') IS NOT NULL 
    DROP TABLE #TEMP3; 

     SELECT A.[Cusip], A.[Bucket] AS ABucket,B.[Bucket] AS BBucket, A.[SumNotionalAmount] AS ASumNotionalAmount , B.[SumNotionalAmount] AS BSumNotionalAmount, 
      [Bucket] = CASE WHEN ABS(A.[SumNotionalAmount])>ABS(B.[SumNotionalAmount]) THEN CASE A.[Bucket] WHEN 0 THEN '=<30' 
            WHEN 1 THEN '31-60' 
            WHEN 2 THEN '61-90' 
            WHEN 3 THEN '91-180' 
            WHEN 4 THEN '181-360' 
            WHEN 5 THEN '+360' 
            END 
          WHEN ABS(A.[SumNotionalAmount])<ABS(B.[SumNotionalAmount]) THEN CASE B.[Bucket] WHEN 0 THEN '=<30' 
            WHEN 1 THEN '31-60' 
            WHEN 2 THEN '61-90' 
            WHEN 3 THEN '91-180' 
            WHEN 4 THEN '181-360' 
            WHEN 5 THEN '+360' 
            END 
          WHEN (ABS(A.[SumNotionalAmount])=ABS(B.[SumNotionalAmount]) AND A.[SumNotionalAmount]>B.[SumNotionalAmount]) THEN CASE B.[Bucket] WHEN 0 THEN '=<30' 
            WHEN 1 THEN '31-60' 
            WHEN 2 THEN '61-90' 
            WHEN 3 THEN '91-180' 
            WHEN 4 THEN '181-360' 
            WHEN 5 THEN '+360' 
            END 
          WHEN (ABS(A.[SumNotionalAmount])=ABS(B.[SumNotionalAmount]) AND A.[SumNotionalAmount]<B.[SumNotionalAmount]) THEN CASE A.[Bucket] WHEN 0 THEN '=<30' 
            WHEN 1 THEN '31-60' 
            WHEN 2 THEN '61-90' 
            WHEN 3 THEN '91-180' 
            WHEN 4 THEN '181-360' 
            WHEN 5 THEN '+360' 
            END 
          ELSE CASE A.[Bucket] WHEN 0 THEN '=<30' 
            WHEN 1 THEN '31-60' 
            WHEN 2 THEN '61-90' 
            WHEN 3 THEN '91-180' 
            WHEN 4 THEN '181-360' 
            WHEN 5 THEN '+360' 
            END 
         END , 
         [RunningSumNotionalAmount] = SUM(A.[SumNotionalAmount]+B.[SumNotionalAmount])OVER(PARTITION BY A.[Cusip]) 
         , 
      [SumNotionalAmount] = CASE WHEN B.[Bucket] IS NOT NULL THEN A.[SumNotionalAmount]+B.[SumNotionalAmount] 
            ELSE A.SumNotionalAmount 
           END INTO #TEMP3 
     FROM #TEMP2 AS A LEFT OUTER JOIN 
      #TEMP2 AS B ON A.[Cusip] = B.[Cusip] AND 
          A.[SignedNotionalAmountRanked] = B.[SignedNotionalAmountRanked] AND 
          A.[Bucket] <> B.[Bucket] 
     WHERE (A.Bucket > B.Bucket OR 
      B.Bucket IS NULL) 
     ORDER BY A.Cusip, 
       A.Bucket 

IF OBJECT_ID('tempdb..#TEMP4') IS NOT NULL 
    DROP TABLE #TEMP4; 
SELECT *, (SELECT SUM(i.[SumNotionalAmount]) 
      FROM #TEMP3 AS i 
      WHERE i.[Cusip] = s.[Cusip] AND      
        i.[Bucket] < s.[Bucket] 
       ) AS RollingStock , HasRemainder = ABS([RunningSumNotionalAmount]) + s.[SumNotionalAmount] INTO #TEMP4 
FROM #TEMP3 AS s 



SELECT [Cusip], 
     [=<30], 
     [31-60], 
     [61-90], 
     [91-180], 
     [181-360], 
     [+360] 
FROM 
( SELECT [Cusip], 
     [Bucket], 
     [SumNotionalAmount] = CASE WHEN SUM([RollingStock]+ [HasRemainder])OVER(PARTITION BY [Cusip]) IS NOT NULL AND 
            [HasRemainder] IS NOT NULL THEN ISNULL([RollingStock],0) 
          ELSE [SumNotionalAmount] 
         END 
    FROM #TEMP4) p 
PIVOT 
( SUM([SumNotionalAmount]) 
    FOR [Bucket] IN ( [=<30], 
        [31-60], 
        [61-90], 
        [91-180], 
        [181-360], 
        [+360] ) 
) AS pvt 

結果:

enter image description here