如何使用LISTAGG实现多列按行关联聚合为指定单行格式?
问题描述
需要将多行数据中的三个关联列合并到单行中。当前使用以下SQL代码,分别对三个字段调用LISTAGG函数后拼接:
, '(' ||(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)
但期望的结果是将每行对应的billing_item_id、billing_item_amount、处理后的instance_name先组合为「ID|金额|课程」的单元,再聚合为如下格式:
321718277 Anon Person SENIOR HIGH SCHOOL 2022-2023 (606547|225|ENGL 1175),(606550|225|MATH 1153)
要求每行的三个关联字段对应组合后再进行聚合。
解决方案
核心思路是先组合每行的三个字段,再对组合后的单元进行聚合,而非分别聚合后再拼接。修改后的SQL代码如下:
, '(' || 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
代码说明:
- 先将每行的三个字段拼接成
ID|金额|课程格式的单元 - 用
LISTAGG对这些单元进行聚合,指定分隔符为),(,按eduid排序 - 最后在首尾拼接
(和),生成完全匹配期望格式的结果
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

