2013-06-20 68 views
3

处理债券分析。我试图制作一个复制excel的PMT功能的支付功能。对于债券,“Cusip”是他们的标识符,他们的“PASS THRU RATE”是他们的年利率,“ORIGINAL WA MATURITY”是期间的总数,而“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到700,000,000,000,“利率”是1-10范围内的利率,“期间”是债券中的总月数, 360。我会分享这些数据,但是这个文件非常大(这就是为什么我不能在excel中做到这一点!)。再次感谢任何帮助! – user2501627

+0

编辑: 好吧,没有改变任何上述代码,并纠正我发现的另一个错误,“算术溢出”现在已经消失。由于意识到我没有每月的利率(PASS THRU RATE),我将我上一个查询中的行更正为: dbo.pmt((mbs012013。[PASS THRU RATE] *(0.01/12)),mbs012013。 [ORIGINAL WA成熟度],mbs012013 [原有的平衡]) 现在我收到的错误: 消息8134,级别16,状态1,行2 除以零错误遇到。 – user2501627

相关问题