我有一个存储多个参数的参数表。所以这用于驱动查询。以下是参数表:
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
答案 0 :(得分:-1)
我很难想象你拥有什么。单词在这里,但我更喜欢 visual 类型,他们更喜欢查看表格描述和示例数据。
说你应该转换货币 - 你会怎么做?那些CUR1
和CUR2
是什么?欧元和美元?究竟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
我希望这是有道理的。