Поскольку вы используете SQL Server, вы можете использовать рекурсивное общее табличное выражение.
Рекурсивный CTE, состоит из двух дополнительных запросов, объединенных вместе. Первый запрос - это якорь, который устанавливает начальные условия для рекурсии или зацикливания, в то время как второй запрос выполняет рекурсию, выполняя самореференциальный выбор. То есть он ссылается на Рекурсивный CTE в предложении from:
-- vvvvvvvvvvvv this is the Recursive CTEs name
with RecursiveCTE(Loan, Payment#, Due_Date, UPB, Int_Rate, Total_PI,
Monthly_Int_Amt, Monthly_Prin_Amt, New_UPB)
as (
-- The Anchor Query
SELECT AMS.Loan,
AMS.Payment#,
AMS.Due_Date,
AMS.UPB,
AMS.Int_Rate,
AMS.Total_PI,
AMS.Monthly_Int_Amt,
AMS.Monthly_Prin_Amt,
AMS.New_UPB
FROM #AmSchedule AMS
UNION ALL
-- The Recursive Part
SELECT Prior.Loan,
Prior.Payment# + 1, -- Increment Pay#
dateadd(mm, 1, Prior.Due_Date), -- Increment Due Date
Prior.new_UPB, -- <-- New_UPB from last iteration
Prior.Int_Rate,
Prior.Total_PI,
Prior.Monthly_Int_Amt, -- <-- Put your
Prior.Monthly_Prin_Amt, -- <-- calculations
Prior.New_UPB -- <-- here
FROM RecursiveCTE Prior
-- ^^^^^^^^^^^^ this is what makes it recursive
)
-- Output the results
select * from RecursiveCTE