2013-06-20 3 views
3

Работа над анализом облигаций. Я попытался сделать функцию платежа, которая реплицирует функцию PMT для excel. Для облигаций «Cusip» является их идентификатором, их «PASS THRU RATE» является их годовой процентной ставкой, «ОРИГИНАЛЬНАЯ МАТЕМАТИКА WA» - это общее количество периодов, а «ORIGINAL BALANCE» - это оригинальная номинальная стоимость связь.Ошибка преобразования арифметического переполнения в тип данных float

Уравнение для расчета ежемесячного платежа по бумаге:

M=[OF(i(1+i)^n)]/[(1+i)^(n-1)] 
M=Monthly payment 
OF=Original Face 
i=annual interest rate/12 
n=number of periods 

У меня есть таблица со всеми столбцами, необходимых для выполнения этой функции, а также различные таблицы для разных месяцев, что я буду пытаться использовать этот для. Это то, что я до сих пор, создавая функцию и пытается исправить для типов данных:

if object_id('dbo.PMT') > 0 
drop function dbo.PMT 
go 

create function dbo.PMT(@rate numeric(15,9), @periods smallint, @principal numeric(20,2)) 
returns numeric (38,9) 
as 
begin 
declare @pmt numeric (38,9) 
select @pmt = @principal 
/(power([email protected],@periods)-1) 
* (@rate*power([email protected],@periods)) 
return @pmt 
end 

go 

drop function dbo.PMT 
go 
create function dbo.PMT 
(
@rate float, 
@periods smallint, 
@principal numeric(20,2) 
) 
returns numeric (38,9) 
as 
begin 
declare @pmt numeric (38,9) 

declare @WK_periods float, 
@WK_principal float, 
@wk_One float, 
@WK_power float 

select @WK_periods = @periods, 
@WK_principal = @principal, 
@WK_One = 1 

select @pmt = 
round(
(@WK_principal * (@rate*power(@[email protected],@WK_periods))) 
/(power(@[email protected],@WK_periods)[email protected]_One) 
,9) 

return @pmt 

end 
go 

select ALL [CUSIP NUMBER] 
,[PASS THRU RATE] 
,[ORIGINAL WA MATURITY] 
,[ORIGINAL BALANCE], 
dbo.pmt((mbs012013.[PASS THRU RATE]),mbs012013.[ORIGINAL WA MATURITY],mbs012013.[ORIGINAL BALANCE]) 
FROM 
    [MBS_STATS].[dbo].[mbs012013] 

Однако я получаю

(502882 row(s) affected) 
Msg 8115, Level 16, State 2, Line 2 
Arithmetic overflow error converting expression to data type float. 

при попытке выполнить его. Я не могу понять, что вызывает это. Любая помощь будет замечательной!

+0

Вы должны указать язык программирования, который вы используете, чтобы получить лучшую поддержку. не только SQL ... так что, пожалуйста, измените теги, добавив еще один или несколько ... –

+0

Sql-server 2008, sql, ddl – user2501627

ответ

1

В строке ниже, у вас есть @WK_principal как FLOAT, и вы присваиваете значение @principal которое является NUMERIC(20,2).

@WK_principal = @principal, 

Это похоже на наиболее вероятное преступление. Нам нужно было бы видеть, что ваши данные помогают в противном случае. Кроме того, я не понимаю, почему вы создаете функцию в одну сторону, затем отбрасываете ее и воссоздаете ее по-разному. Или вы просто показываете две разные попытки?

+0

Это была моя первая попытка. Я изменил типы данных, но все равно получаю ту же ошибку. Если это помогает, «основной» является начальная сумма облигации, которая колеблется от 0 до 70 000 000 000, «ставка» представляет собой процентную ставку, которая колеблется от 1 до 10, «периоды» - это общие месяцы в облигации и варьируются от 0- 360. Я бы поделился данными, но файл невероятно большой (вот почему я не могу это сделать в excel!). Еще раз спасибо за любую помощь! – user2501627

+0

EDIT: Хорошо, без изменения какого-либо из вышеуказанного кода и исправления для другой ошибки, я заметил, что «арифметическое переполнение» теперь исчезло. Понимая, что я не делал (PASS THRU RATE) ежемесячную процентную ставку, я исправил строку в своем последнем запросе до: dbo.pmt ((mbs012013. [PASS THRU RATE] * (0.01/12)), mbs012013. [ОРИГИНАЛ WA ЗРЕЛОСТЬ], mbs012013 [ОРИГИНАЛ BALANCE]) Сейчас я получаю сообщение об ошибке:. Msg 8134, уровень 16, состояние 1, строка 2 Деление на ноль ошибка, обнаруженная. – user2501627

Смежные вопросы