Рекурсивный беговой баланс (предложения Encash) - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь реализовать следующий бизнес-сценарий -

Я получу данные о выкупе пользователя оптом. Мне нужно вести бухгалтерский журнал этих погашений в отношении различных доходов, полученных одним и тем же пользователем. Вот пример данных.

DECLARE @TransData AS TABLE(TransDataID int IDENTITY(1,1), PropertyID int, TransactionAmount decimal(18,2))

INSERT INTO @TransData (PropertyID, TransactionAmount)
SELECT 1,10
UNION
SELECT 1,20
UNION
SELECT 1,30
UNION
SELECT 1,40
UNION
SELECT 1,50
UNION
SELECT 1,60
UNION
SELECT 1,70

DECLARE @AdjustmentData as TABLE ( DailyBalanceID bigint, AvailableBalance decimal(18,8), [PropertyID] bigint )
INSERT INTO @AdjustmentData
VALUES
( 1000092, 80.00000000, 1 ), 
( 1000093, 101.00000000, 1 ), 
( 1000094, 100.00000000, 1 ), 
( 1003708, 111.00000000, 1 ), 
( 1022176, 10.00000000, 1 );

Пример

TransData 
ID  TransactionAmount
1  10
2  20
3  30
4  40
5  50
6  60
7  70

AdjustmentData 
DailyBalanceID  AvailableBalance
1000092  80
1000093  101
1000094  100
1003708  111
1022176  10

AdjustmentData  TransData  
ID  TransactionAmount  DailyBalanceID  AvailableBalance  AdjustmentData.TransactionAmount  Calculation
1000092  80  1  10 
1000092  70  2  20  AdjustmentData.AvailableBalance (80) -= TransData.TransactionAmount (10)
1000092  50  3  30  AdjustmentData.AvailableBalance (70) -= TransData.TransactionAmount (20)
1000092  20  4  40  AdjustmentData.AvailableBalance (50) -= TransData.TransactionAmount (30)
1000092  -20   
1000093  101  5  50 
1000093  41  6  60  AdjustmentData.AvailableBalance (101) -= (TransData.TransactionAmount (50)+LastRowNegativeBalance(-20))
1000093  -19   
1000094  100  7  70  AdjustmentData.AvailableBalance (100) -= (TransData.TransactionAmount (70)+LastRowNegativeBalance(-19))
1000094  11   

Blockquote

Приведенный ниже ожидаемый результат в изображении enter image description here

...