Расчет обмена валют в САС
У меня есть две таблицы: первая учетная запись состоит из следующих данных:
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
Вторая таблица состоит из обменного курса
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
Мне нужно создать таблицу, в которой " Экспозиция" и " Лимит" будут переведены в валюту евро по курсу второй таблицы. Если данные уже в евро, их нужно просто умножить на 1, остальные должны быть рассчитаны в соответствии со ставкой во второй таблице. Тариф должен также соответствовать 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, но я не смог заставить его работать. Если кто-то может помочь выяснить, как я мог это сделать? У меня есть больше столбцов для расчета, как это.
Заранее спасибо.
2 ответа
Вы можете принять подход с использованием хеш-таблиц и расширить ключи хеширования и соответствующие поиски на столько переменных, сколько вам необходимо:
данные хотят; если _n_ = 1, тогда делай; / * Определить и загрузить хэш-таблицу преобразований * / длина валюты от $3. date_extr fx_rate 8.; объявить хеш исключение (набор данных:"обмен"); exc.defineKey('currency_from','date_extr'); /* расширить это на большее количество переменных */ exc.defineData('fx_rate'); exc.defineDone(); вызов отсутствует (of currency_from- fx_rate); конец; установить учетные записи; / * Поиск Expo_Curr + date_extr в хеш-таблице */ rc = exc.find(ключ:expo_curr, ключ:date_extr); /* расширить это, чтобы соответствовать * / если rc = 0, тогда делай; expo_rate = fx_rate; экспозиция2 = экспозиция * expo_rate; конец; /* Lookup Limit_Curr + date_extr в хеш-таблице */ rc = exc.find(ключ:limit_curr, ключ:date_extr); /* расширить это, чтобы соответствовать * / если rc = 0, тогда делай; limit_rate = fx_rate; limit2 = limit * limit_rate; конец; падение rc; бежать;
https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm
Вам просто нужно дважды присоединиться к таблице FX. Один за предел, один за воздействие.
Например
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'