3

債券のさまざまな側面に基づいて、「CPR」機能を見つけています。

現在の式は次のとおりです。

SELECT All
a.[CUSIP NUMBER],
CPR,
a.[POOL PREFIX],
a.[POOL NUMBER],
a.[POOL TYPE],
a.[CURRENT MM],
a.[CURRENT YY],
a.[ISSUE MM],
a.[ISSUE DD],
a.[ISSUE YY],
a.[MATURITY MM],
a.[MATURITY DD],
a.[MATURITY YY],
a.[SELLER NAME],
a.[SELLER STREET],
a.[SELLER CITY],
a.[SELLER STATE],
a.[SELLER ZIP],
a.[ORIGINAL WA COUPON],
a.[SD SECURITY TYPE],
a.[SD INTEREST RATE],
a.[SD POOL PREFIX],
a.[SD POOL NUMBER],
a.[CURRENT WA COUPON],
a.[CURRENT BALANCE],
a.[ORIGINAL WA MATURITY],
a.[CURRENT WA MATURITY],
a.[PASS THRU RATE],
a.[CURRENT FACTOR],
b.[CURRENT FACTOR] as AprilFactor,
b.[ORIGINAL BALANCE],
MonthlyRate,
Payment,
InterestPayment,
Principle,
ScheduledFace,
PreviousFace,
ScheduledFactor,
SMM
INTO March2013CPR
FROM dbo.mbs022013 a
JOIN dbo.mbs032013 b ON a.[CUSIP NUMBER] = b.[CUSIP NUMBER]
CROSS APPLY (Select (a.[PASS THRU RATE]*.01)/12) CA(MonthlyRate)
CROSS APPLY (Select (a.[CURRENT BALANCE] * ((MonthlyRate)/((1-(1/power(1+ MonthlyRate, a.[CURRENT WA MATURITY]))))))) CA2(Payment)
Cross Apply (Select a.[CURRENT BALANCE] * MonthlyRate) CA3 (InterestPayment)
Cross Apply (Select Payment - InterestPayment) CA4 (Principle)
Cross Apply (Select a.[ORIGINAL BALANCE] * a.[CURRENT FACTOR]) CA5 (PreviousFace)
CROSS APPLY (Select PreviousFace - Principle) CA6(ScheduledFace)
Cross Apply (Select ScheduledFace/a.[ORIGINAL BALANCE]) CA7 (ScheduledFactor)
Cross Apply (Select 100 * (1-(b.[CURRENT FACTOR]/ScheduledFactor))) CA8(SMM)
Cross Apply (Select (1-(power(1-SMM/100,12)))*100) CA9 (CPR)
WHERE a.[CURRENT WA MATURITY] != 0 and a.[CURRENT BALANCE] != 0

各債券の CPR 値を含む新しいテーブルにポートフォリオ全体を掲載できるように、相互適用を通じて計算しました。この関数は数か月のデータに対して機能しましたが、今月は次のように返されました。

Msg 8117, Level 16, State 1, Line 49
Operand data type varchar is invalid for multiply operator.

これは、3 月の関数を計算しています。3 月のファイルは、2 月のファイルと 3 月のファイルの情報を使用します。ただし、1月と2月のデータを使用する2月のファイルと、4月と3月のデータを使用する4月のファイルの関数は正しいため、どちらのファイルにも問題はないと思います。

49 行目は次の行です。

Cross Apply (Select a.[ORIGINAL BALANCE] * a.[CURRENT FACTOR]) CA5 (PreviousFace)

修正方法はありますか?:-D

アップデート:

以下にデータの例を示します。

CUSIP NUMBER     Original Balance     Current Factor     Pass Thru Rate  Current Balance
31416HAB1        00000325972000       0.19556008         04.500         00000063747109
31416HAB1        00003749061700       0.11487645         05.000         00000430678890
31416HAC9        00002164121900       0.15490762         05.500         00000335238974
31416HAD7        00000274716900       0.22204878         06.000         00000061000552
31416HAE5        00018198400200       0.10905233         06.000         00001984577976

現在の WA 成熟度の範囲は 0 ~ 360 です。

4

1 に答える 1

5

@Alex K と Dev n00b のコメントを拡張すると、[Original Balance] に文字データが含まれているように見えます。これは、先行ゼロによって証明されます。データ型の優先順位により、文字型 (char/varchar/nchar/nvarchar) から数値型 (int/float/decimal) への暗黙的な変換が可能になります。

データのどこかに、その列に数値以外の値があるようです。CAST が失敗すると、CONVERT も失敗します。間違った行を見つけて、データを修正する必要がある場合があります。それ以外の場合、これらの値を無視でき、SQL Server 2012 を使用しているため、次のようなTRY_CONVERT関数を利用できます。

Cross Apply (Select TRY_CONVERT(bigint, a.[ORIGINAL BALANCE]) * a.[CURRENT FACTOR]) CA5 (PreviousFace)
于 2013-07-23T16:10:51.110 に答える