Получить максимальную дату переменной в l oop по сравнению с датой погашения - PullRequest
0 голосов
/ 14 января 2020

Я создаю отчет на SQL Сервере, который будет возвращать все купонные выплаты по каждой из моих облигаций за дату купона. У меня есть в таблице информация о каждой облигации (срок погашения, купон, частота купона и т. Д. c), и я строю календарь выплат по каждому из них. Я застрял в точке, в которой последний купонный платеж не равен сроку погашения. , В этом случае я хотел бы добавить еще одну строку в календарь этой облигации с датой погашения.

Вот мой код:

----Declare variables for loop-----
DECLARE @innertable TABLE
(
     isin        VARCHAR(12), 
     alt_id      VARCHAR(11), 
     coupon_date DATE,
     maturity    DATE
);

DECLARE @id INT;
DECLARE @bcursor AS CURSOR;
DECLARE @NextDate DATE;
DECLARE @MatDate DATE;
DECLARE @isin VARCHAR(12);
DECLARE @alt_id VARCHAR(11);

---------SET you primary cursor, in this case ID--------------
SET @bcursor = CURSOR FOR 
    SELECT id
    FROM Bond_info;

OPEN @bcursor;
FETCH NEXT FROM @bcursor INTO @id;

WHILE @@FETCH_STATUS = 0
BEGIN
    ------------SET the inner loop------------------ 
    --PRINT CAST(@id AS INT);

    SET @isin =
        (
            SELECT isin
            FROM Bond_info
            WHERE id = @id
        );
    SET @alt_id =
        (
            SELECT alt_id
            FROM Bond_info
            WHERE id = @id
        );
    SET @NextDate =
        (
            SELECT first_coupon_date
            FROM Bond_info
            WHERE id = @id
        );
    SET @MatDate =
        (
            SELECT maturity
            FROM Bond_info
            WHERE id = @id
        );

    WHILE @NextDate <= @MatDate
    BEGIN
        INSERT INTO @innertable (coupon_date, isin, alt_id, maturity)
        VALUES (@NextDate, @isin, @alt_id, @MatDate);

        SET @NextDate =
                (
                    SELECT DATEADD(month, (12 / t1.coupon_freq), @NextDate)
                    FROM bond_info t1
                    WHERE id = @id
                );
    END;

    ---------- END of inner loop ------------
END;

FETCH NEXT FROM @bcursor INTO @id;

CLOSE @bcursor;
DEALLOCATE @bcursor;

--------------SHOW RESULT TABLE-----------
SELECT *
FROM @innertable;


----------integrate data and Calculate cash flow-----------
SELECT 
    t1.isin, 
    t1.alt_id,
    t1.coupon_date,
    t1.maturity,
    Bond_info.coupon, 
    Bond_info.coupon_type, 
    Bond_info.coupon_freq,
    t2.account_number,
    (t2.quantity * Bond_info.coupon) as coupon_payment_annual,
    (t2.quantity * Bond_info.coupon) / Bond_info.coupon_freq as coupon_payment_freq,
    ((t2.quantity * Bond_info.coupon) / Bond_info.coupon_freq)*Bond_info.principal_factor as coupon_pmt_freq_factor,
    iif(t1.coupon_date = Bond_info.maturity,  (((t2.quantity * Bond_info.coupon) / Bond_info.coupon_freq)*Bond_info.principal_factor)+ t2.quantity,((t2.quantity * Bond_info.coupon) / Bond_info.coupon_freq)*Bond_info.principal_factor) as cash_flows
FROM 
    @innertable t1
INNER JOIN 
    Bond_info ON t1.isin = Bond_info.isin
INNER JOIN 
    portfolio_details t2 ON t1.isin = t2.id 
WHERE 
    t2.account_number IN ('Acc1', 'Acc2', 'Acc3', 'Acc4') 
ORDER BY 
    t2.account_number, t1.isin,t1.coupon_date

Таблица, полученная из этого запроса, выглядит следующим образом:

Result table screenshot

Для второй - в последнем coupon_date <> Maturity_date, поэтому я хотел бы добавить дату погашения в coupon_date. Может ли кто-нибудь помочь мне с этим?

Заранее спасибо!

...