Oracle根据一列的值将多行分组为一个

时间:2020-09-29 02:10:38

标签: oracle group-by

当前,我有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

1 个答案:

答案 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')
);

输出:

enter image description here