当前,我有1个表,其结构如下(ID列是主键):
ID Sub_ID ACC_TYPE ACC_NO ACC_CCY AMOUNT
---------------- ------ ---------- ------ -------- ------
KA31005493FC27XQ DEF MAIN_CR 1111 USD 100
KA31005493FC27XR DEF MAIN_DR 2222 EUR 200
KA31005493BC27XP DEF SA_MAIN_CR 3333 JPY 300
KA310054937C27XO DEF SA_MAIN_DR 4444 HKD 400
KA31005493KC27XZ DEF PNL_CR 5555 CNY 500
上面的值没有任何规则,我只是为了让您易于理解而做了。
我想选择具有ACC_TYPE = MAIN_CR / SA_MAIN_DR的行的ACC_NO,ACC_CCY列,并将其放入1行,其中列名分开。同样对于ACC_TYPE = SA_MAIN_CR / MAIN_DR到1行的行。
并且AMOUNT_CR / AMOUNT_DR列等于具有相应ACC_TYPE的行的AMOUNT(具有SA_MAIN_CR的MAIN_CR到AMOUNT_CR,具有SA_MAIN_DR的MAIN_DR到AMOUNT_DR列)。
以下是我的预期输出:
Sub_ID ACC_NO_CR ACC_CCY_CR ACC_NO_DR ACC_CCY_DR AMOUNT_CR AMOUNT_DR
------ ---------- ---------- --------- ---------- --------- ---------
DEF 1111 USD 4444 HKD 100 400
DEF 3333 JPY 2222 EUR 300 200
如果没有SA_MAIN_CR / SA_MAIN_DR行,则输出应为:
Sub_ID ACC_NO_CR ACC_CCY_CR ACC_NO_DR ACC_CCY_DR AMOUNT_CR AMOUNT_DR
------ ---------- ---------- --------- ---------- --------- ---------
DEF 1111 USD 2222 EUR 100 200
答案 0 :(得分:1)
当然可以。
要创建数据表,请执行以下操作:
create table tab as
with inputs (ID,Sub_ID,ACC_TYPE,ACC_NO,ACC_CCY,AMOUNT) as
(
select 1,'DEF','MAIN_CR',1111,'USD',100 from dual union all
select 2,'DEF','MAIN_DR',2222,'EUR',200 from dual union all
select 3,'DEF','SA_MAIN_CR',3333,'JPY',300 from dual union all
select 4,'DEF','SA_MAIN_DR',4444,'HKD',400 from dual
)
select * from inputs;
解决方案:
select sub_id_general as sub_id, acc_no_cr, acc_ccy_cr, amount_cr, acc_no_dr, acc_ccy_dr, amount_dr
from tab
match_recognize
(
order by id
measures sub_id as sub_id_general,
CR.acc_no as acc_no_cr,
CR.acc_ccy as acc_ccy_cr,
CR.amount as amount_cr,
DR.acc_no as acc_no_dr,
DR.acc_ccy as acc_ccy_dr,
DR.amount as amount_dr
pattern (CR DR)
define CR as acc_type in ('MAIN_CR','SA_MAIN_CR'),
DR as acc_type in ('MAIN_DR','SA_MAIN_DR')
);
输出: