oracle 是否可以使用三个LISTAGG并按行中的元素分组?

7kjnsjlb  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(148)

我有一个情况,我想把三个不同的列,其中每一个有多行,到一个单一的行。
我正在使用这段代码,它可以为我提供所有的第一列,然后是第二列,然后是第三列。

, '(' ||(LISTAGG(billing_item_id, ', ') WITHIN GROUP (order by eduid) || ' | ' ||  LISTAGG(billing_item_amount, ', ') WITHIN GROUP (order by eduid))  || ' | ' ||  LISTAGG(REGEXP_SUBSTR(instance_name,'^[A-Z]{3,4} [0-9]{4}'), ', ') WITHIN GROUP (order by eduid) || ')' as billing

结果如下:

321718277   Anon Person SENIOR HIGH SCHOOL  2022-2023   (606547, 606550 | 225, 225 | ENGL 1175, MATH 1153)

我想看到的是

321718277   Anon Person SENIOR HIGH SCHOOL  2022-2023   (606547|225|ENGL 1175),(606550|225|MATH 1153)

账单id 606547、金额225和课程ENGL 1175都在同一行上。

gt0wga4j

gt0wga4j1#

连接listagg中的值,而不是listagg本身。类似于以下内容:

SQL> with test(eduid, billing_item_id, billing_item_amount, instance_name) as
  2    (select 1, 606547, 225, 'ENGL 1175' from dual union all
  3     select 2, 606550, 225, 'MATH 1153' from dual
  4    )
  5  select listagg('(' || billing_item_id     ||'|'||
  6                        billing_item_amount ||'|'||
  7                        REGEXP_SUBSTR(instance_name,'^[A-Z]{3,4} [0-9]{4}') || ')', ',')
  8         within group (order by eduid) as billing
  9  from test;

BILLING
--------------------------------------------------------------------------------
(606547|225|ENGL 1175),(606550|225|MATH 1153)

SQL>
pxq42qpu

pxq42qpu2#

@Littlefoot.是的.这就是我需要的语法.

, listagg('(' || billing_item_id     ||'|'|| billing_item_amount ||'|'||  REGEXP_SUBSTR(instance_name,'^[A-Z]{3,4} [0-9]{4}') || ')', ',')  within group (order by eduid) as billing

相关问题