1
提前道歉解釋。任何幫助,將不勝感激。FIFO庫存老化
我們有如下表:
此表包含6桶:
- 360:資產或負債在360天以上
- 181舉行 - 360:資產或負債在181 - 360日之間持有
- 91 - 180:91 - 180日之間持有的資產或負債
- 61 - 90:61之間保持資產或負債 - 90天
- 31 - 60:31之間保持資產或負債 - 60天
- = < 30:資產或負債保持30天或更少
我們要應用下面的邏輯來得到結果如下圖所示:
的邏輯如下:
- 從列360開始,從資產中減去負債。
- 如果結果是負債,我們有資產留在下面的桶中,那麼從下面的欄中減去資產等等,直到我們通過所有資產桶或者我們有0桶資產和負債。
- 如果結果是一項資產,而且我們有剩餘的負債存在於較低的存貨桶中,那麼從其中減去下一列的負債,等等,直到我們通過所有資產桶或者我們有該存貨桶的0資產和負債。
- 如果我們設法完全清除剩餘的資產或負債,並且仍然存在來自較低存儲桶的一些資產或債務,那麼當我們從較高存儲桶(91-180)減去較低存儲桶(31-60)時,較低的桶將成爲剩餘部分,並將用於評估下一個桶。 (見下面的例子爲這種情況)
這樣設定:
將變爲:
我試圖避免使用循環和希望用遊標而不是遊標來實現這一點。我自己有幾個去做,但不能完全得到我需要的結果。 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')
我認爲你需要做一些工作,而不是在這裏定義你的業務邏輯...... – JonH
你的解釋很不錯,但有點混亂,你可以用樣本數據重現那些步驟,以便我們更好地理解它? –
這聽起來像是在FIFO基礎上消耗庫存的變化。 [This](http://stackoverflow.com/questions/9420173/sql-subtracting-a-depleting-value-from-rows/9421009#9421009)答案可能會提供一些提示。 – HABO