Я создаю отчет на 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
Таблица, полученная из этого запроса, выглядит следующим образом:
Для второй - в последнем coupon_date <> Maturity_date, поэтому я хотел бы добавить дату погашения в coupon_date. Может ли кто-нибудь помочь мне с этим?
Заранее спасибо!