在SQL

时间:2018-03-06 09:28:37

标签: sql oracle

我有一个存储多个参数的参数表。所以这用于驱动查询。以下是参数表:

P_ID  P_NAME              P_VALUE
1     BASE_CURRENCY_FLG   Y
2     BASE_CURRENCY       EUR
3     GLOBAL_CURRENCY     USD

我有一个交易表 TRXN ,它存储交易金额和交易货币。

我还有 currency_rate 表,其中包含CUR1,CUR2,CUR1_CUR2_CONV_RATE列。

所以我的要求是每当 BASE_CURRENCY_FLG 为N时,我们必须从trxn表中获取金额和货币值,并使用currency_rate表转换为USD。

同样,如果 BASE_CURRENCY_FLG 为Y,那么我们必须将交易金额转换为EUR。

我们必须在SQL块(而不是PL / SQL)中编写它。数据库是Oracle。任何帮助将受到高度赞赏。

我们尝试使用CASE语句但无法达到预期效果。 以下是样本数据:

TRXN表

TXN_ID          TXN_AMT     TXN_CURRENCY
100             45564.23    EUR
180             2908        INR
232             654         USD
198             1223        AUD

CURRENCY_RATE表

C_ID       CUR1       CUR2     CUR1_CUR2_CONV_RATE
1          INR        USD      64.2
2          INR        EUR      80.2
3          EUR        USD      1.23
4          USD        EUR      0.81
5          USD        AUD      1.28

1 个答案:

答案 0 :(得分:-1)

我很难想象你拥有什么。单词在这里,但我更喜欢 visual 类型,他们更喜欢查看表格描述和示例数据。

说你应该转换货币 - 你会怎么做?那些CUR1CUR2是什么?欧元和美元?究竟CUR1_CUR2_CONV_RATE到底意味着什么? CUR1/CUR2或对面或......?

因此,这可能 - 或可能不是 - 可能的选择之一。它结合了两个类似的SELECT语句;区别基于BASE_CURRENCY_FLG值以及您应该对CUR1_CUR2_CONV_RATE执行的操作。如有必要,请修复它。

SELECT t.tr_amount, t.tr_currency * cr.cur1_cur2_conv_rate
  FROM trxn t JOIN currency_rate cr ON cr.cur1 = tr.tr_currency
 WHERE 'N' = (SELECT base_currency_flg FROM param)
UNION
SELECT t.tr_amount, t.tr_currency / cr.cur1_cur2_conv_rate
  FROM trxn t JOIN currency_rate cr ON cr.cur1 = tr.tr_currency
 WHERE 'Y' = (SELECT base_currency_flg FROM param)

<强> [编辑]

好的,现在有道理了。这是一个查询;实际有用的代码从第22行开始。

SQL> with trxn (txn_id, txn_amt, txn_currency) as
  2    (select 100, 45564.23, 'EUR' from dual union
  3     select 180, 2908    , 'INR' from dual union
  4     select 232, 654     , 'USD' from dual union
  5     select 198, 1223    , 'AUD' from dual union
  6     --
  7     select 500, 100, 'EUR' from dual union
  8     select 501, 100, 'INR' from dual
  9    ),
 10  currency_rate (c_id, cur1, cur2, cur1_cur2_conv_rate) as
 11    (select 1, 'INR', 'USD', 64.2 from dual union
 12     select 2, 'INR', 'EUR', 80.2 from dual union
 13     select 3, 'EUR', 'USD', 1.23 from dual union
 14     select 4, 'USD', 'EUR', 0.81 from dual union
 15     select 5, 'USD', 'AUD', 1.28 from dual
 16    ),
 17  param (p_id, p_name, p_value) as
 18    (select 1, 'BASE_CURRENCY_FLG', 'Y' from dual union  --> while testing, change Y -> N
 19     select 2, 'BASE_CURRENCY', 'EUR'   from dual union  --  and vice versa
 20     select 3, 'GLOBAL_CURRENCY', 'USD' from dual
 21    )
 22  select t.txn_id,
 23         t.txn_amt,
 24         t.txn_currency,
 25         t.txn_amt * cr.cur1_cur2_conv_rate converted,
 26         cr.cur2
 27    from trxn t join currency_rate cr on cr.cur1 = t.txn_currency
 28   where     'Y' = (select p_value
 29                      from param
 30                     where p_name = 'BASE_CURRENCY_FLG')
 31         and cr.cur2 = 'EUR'
 32  union
 33  select t.txn_id,
 34         t.txn_amt,
 35         t.txn_currency,
 36         t.txn_amt * cr.cur1_cur2_conv_rate converted,
 37         cr.cur2
 38    from trxn t join currency_rate cr on cr.cur1 = t.txn_currency
 39   where     'N' = (select p_value
 40                      from param
 41                     where p_name = 'BASE_CURRENCY_FLG')
 42         and cr.cur2 = 'USD'
 43  order by txn_id;

    TXN_ID    TXN_AMT TXN  CONVERTED CUR
---------- ---------- --- ---------- ---
       180       2908 INR   233221,6 EUR
       232        654 USD     529,74 EUR
       501        100 INR       8020 EUR

SQL>

如果BASE_CURRENCY_FLG更改为&#39; N&#39;,则结果为

    TXN_ID    TXN_AMT TXN  CONVERTED CUR
---------- ---------- --- ---------- ---
       100   45564,23 EUR 56044,0029 USD
       180       2908 INR   186693,6 USD
       500        100 EUR        123 USD
       501        100 INR       6420 USD

我希望这是有道理的。