SAS 中的货币兑换计算
Currency exchange calculation in SAS
我有两个 table 第一个帐户包含以下数据:
Code | Exposure | Expo_Curr | Limit | Limit_curr | Date_extr
2105 | 2.354586 | EUR | 288.6 | HUF | 1405
2105 | 25.46658 | USD | 12.32 | CAD | 1203
2105 | 5.987456 | CAD | 321.2 | CZK | 1107
2105 | 9.658785 | HRK | 5.365 | EUR | 1103
第二个table包括汇率
Code | date_extr | currency_from | currency_to | fx_rate
2105 | 1405 | HUF | EUR | 4.36
2105 | 1203 | USD | EUR | 3.62
2105 | 1203 | CAD | EUR | 1.23
2105 | 1107 | CAD | EUR | 1.17
2105 | 1107 | CZK | EUR | 24.6
2105 | 1103 | HRK | EUR | 35.6
我需要创建 table,其中 Exposure 和 Limit 将根据汇率在第二 table。如果数据已经以欧元为单位,则应将其乘以 1,其余部分应根据秒 table 中的汇率计算。费率也应匹配 date_extr(费率有效时为 YYMM)。
应该是这样的:
Code | Exposure | Expo_Curr | Limit | Limit_curr | Date_extr
2105 | 2.354586*1.00 | EUR | 288.6*4.36 | HUF | 1405
2105 | 25.46658*3.62 | USD | 12.32*1.23 | CAD | 1203
2105 | 5.987456*1.17 | CAD | 321.2*24.6 | CZK | 1107
2105 | 9.658785*35.6 | HRK | 5.365*1.00 | EUR | 1103
我正在使用 SAS,所以我尝试使用 SQL join 来完成它,但我无法让它工作。如果有人可以帮助弄清楚我该怎么做?我有更多列可以这样计算。
提前谢谢你。
您只需要在 FX table 上离开加入两次。一为极限,一为曝光。
例如
SELECT
CASE
WHEN acc.expo_curr = 'EUR'
THEN acc.exposure
ELSE acc.exposure * expo.fx_rate
END AS exposure,
acc.expo_curr,
CASE
WHEN acc.limit_curr = 'EUR'
THEN acc.limit
ELSE acc.limit * lim.fx_rate
END AS limit,
acc.limit_curr
FROM account acc
LEFT JOIN exchange expo
ON expo.date_extr = acc.date_extr
AND expo.currency_from = acc.expo_curr
AND expo.currency_to = 'EUR'
LEFT JOIN exchange lim
ON lim.date_extr = acc.date_extr
AND lim.currency_from = acc.limit_curr
AND lim.currency_to = 'EUR'
您可以采用散列-table 方法,并将散列键和相应的查找扩展到所需数量的匹配变量:
data want ;
if _n_ = 1 then do ;
/* Define & load hash table of conversions */
length currency_from . date_extr fx_rate 8. ;
declare hash exc (dataset:"exchange") ;
exc.defineKey('currency_from','date_extr') ; /* extend this to more variables */
exc.defineData('fx_rate') ;
exc.defineDone() ;
call missing(of currency_from--fx_rate) ;
end ;
set accounts ;
/* Lookup Expo_Curr + date_extr in hash table */
rc = exc.find(key:expo_curr,key:date_extr) ; /* extend this to match */
if rc = 0 then do ;
expo_rate = fx_rate ;
exposure2 = exposure * expo_rate ;
end ;
/* Lookup Limit_Curr + date_extr in hash table */
rc = exc.find(key:limit_curr,key:date_extr) ; /* extend this to match */
if rc = 0 then do ;
limit_rate = fx_rate ;
limit2 = limit * limit_rate ;
end ;
drop rc ;
run ;
https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003143739.htm
我有两个 table 第一个帐户包含以下数据:
Code | Exposure | Expo_Curr | Limit | Limit_curr | Date_extr
2105 | 2.354586 | EUR | 288.6 | HUF | 1405
2105 | 25.46658 | USD | 12.32 | CAD | 1203
2105 | 5.987456 | CAD | 321.2 | CZK | 1107
2105 | 9.658785 | HRK | 5.365 | EUR | 1103
第二个table包括汇率
Code | date_extr | currency_from | currency_to | fx_rate
2105 | 1405 | HUF | EUR | 4.36
2105 | 1203 | USD | EUR | 3.62
2105 | 1203 | CAD | EUR | 1.23
2105 | 1107 | CAD | EUR | 1.17
2105 | 1107 | CZK | EUR | 24.6
2105 | 1103 | HRK | EUR | 35.6
我需要创建 table,其中 Exposure 和 Limit 将根据汇率在第二 table。如果数据已经以欧元为单位,则应将其乘以 1,其余部分应根据秒 table 中的汇率计算。费率也应匹配 date_extr(费率有效时为 YYMM)。
应该是这样的:
Code | Exposure | Expo_Curr | Limit | Limit_curr | Date_extr
2105 | 2.354586*1.00 | EUR | 288.6*4.36 | HUF | 1405
2105 | 25.46658*3.62 | USD | 12.32*1.23 | CAD | 1203
2105 | 5.987456*1.17 | CAD | 321.2*24.6 | CZK | 1107
2105 | 9.658785*35.6 | HRK | 5.365*1.00 | EUR | 1103
我正在使用 SAS,所以我尝试使用 SQL join 来完成它,但我无法让它工作。如果有人可以帮助弄清楚我该怎么做?我有更多列可以这样计算。
提前谢谢你。
您只需要在 FX table 上离开加入两次。一为极限,一为曝光。
例如
SELECT
CASE
WHEN acc.expo_curr = 'EUR'
THEN acc.exposure
ELSE acc.exposure * expo.fx_rate
END AS exposure,
acc.expo_curr,
CASE
WHEN acc.limit_curr = 'EUR'
THEN acc.limit
ELSE acc.limit * lim.fx_rate
END AS limit,
acc.limit_curr
FROM account acc
LEFT JOIN exchange expo
ON expo.date_extr = acc.date_extr
AND expo.currency_from = acc.expo_curr
AND expo.currency_to = 'EUR'
LEFT JOIN exchange lim
ON lim.date_extr = acc.date_extr
AND lim.currency_from = acc.limit_curr
AND lim.currency_to = 'EUR'
您可以采用散列-table 方法,并将散列键和相应的查找扩展到所需数量的匹配变量:
data want ; if _n_ = 1 then do ; /* Define & load hash table of conversions */ length currency_from . date_extr fx_rate 8. ; declare hash exc (dataset:"exchange") ; exc.defineKey('currency_from','date_extr') ; /* extend this to more variables */ exc.defineData('fx_rate') ; exc.defineDone() ; call missing(of currency_from--fx_rate) ; end ; set accounts ; /* Lookup Expo_Curr + date_extr in hash table */ rc = exc.find(key:expo_curr,key:date_extr) ; /* extend this to match */ if rc = 0 then do ; expo_rate = fx_rate ; exposure2 = exposure * expo_rate ; end ; /* Lookup Limit_Curr + date_extr in hash table */ rc = exc.find(key:limit_curr,key:date_extr) ; /* extend this to match */ if rc = 0 then do ; limit_rate = fx_rate ; limit2 = limit * limit_rate ; end ; drop rc ; run ;
https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003143739.htm