Расчет обмена валют в САС

У меня есть две таблицы: первая учетная запись состоит из следующих данных:

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'
Другие вопросы по тегам