Функция вычисления IRR - SQL Server (неравные платежи)
У нас есть скалярная функция для вычисления irr (INTERNAL RATE OF RETURN), которую мы используем в sql server. Он успешно работает для 4 платежей, если платежи равны или если 1-й платеж больше среднего значения платежей. Однако нам нужна функция, которая работает, если платежи имеют неравные суммы. Также мы хотим, чтобы она работала, если либо 1, Вводится 2, 3 или 4 платежа. У кого-нибудь есть функция, которая бы работала.
Скалярная функция, которую мы используем в настоящее время, показана ниже:
USE [TESTDB]
GO
/****** Object: UserDefinedFunction [dbo].[Calculate_IRR] Script Date: 05/28/2018 08:01:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Calculate_IRR](@nper float, @pmt float , @pv float)
RETURNS decimal(9,2)
AS
BEGIN
DECLARE @fv FLOAT = 0
DECLARE @type INT = 0
DECLARE @guess DECIMAL(6,3) = .1
DECLARE @rate FLOAT
DECLARE @FINANCIAL_MAX_ITERATIONS INT = 128
DECLARE @FINANCIAL_PRECISION FLOAT = .0000001
DECLARE @y FLOAT
DECLARE @y0 FLOAT
DECLARE @y1 FLOAT
DECLARE @f FLOAT
DECLARE @i INT
DECLARE @x0 FLOAT = 0
DECLARE @x1 FLOAT
SET @rate = @guess
IF(ABS(@rate) < @FINANCIAL_PRECISION)
BEGIN
SET @y = @pv * (1 + @nper * @rate) + @pmt * (1 + @rate * @type) * @nper + @fv
END
ELSE
BEGIN
SET @f = EXP(@nper * LOG(1 + @rate))
SET @y = @pv * @f + @pmt * (1 / @rate + @type) * (@f - 1) + @fv
END
SET @y0 = @pv + @pmt * @nper + @fv
SET @y1 = @pv * @f + @pmt * (1 / @rate + @type) * (@f - 1) + @fv
SET @i = @x0
SET @x1 = @rate
WHILE ((ABS(@y0 - @y1) > @FINANCIAL_PRECISION) AND (@i < @FINANCIAL_MAX_ITERATIONS))
BEGIN
SET @rate = (@y1 * @x0 - @y0 * @x1) / (@y1 - @y0)
SET @x0 = @x1
SET @x1 = @rate
IF (ABS(@rate) < @FINANCIAL_PRECISION)
BEGIN
SET @y = @pv * (1 + @nper * @rate) + @pmt * (1 + @rate * @type) * @nper + @fv
END
ELSE
BEGIN
SET @f = EXP(@nper * LOG(1 + @rate))
SET @y = @pv * @f + @pmt * (1 / @rate + @type) * (@f - 1) + @fv
END
SET @y0 = @y1
SET @y1 = @y
SET @i = @i + 1
END
RETURN @rate * 12.00 *100.00
END