oracle在group by时某列有多个值的拼接

本文分享了在SQL中如何处理分组后列值的多个情况,通过具体实例介绍了使用wm_concat()函数和LISTAGG函数的方法,实现将多个值进行有效拼接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近编码过程中出现了group by后,某些列会有多个值,而我需要把这些多个值的列进行拼接的情况,和大家分享一下。

有如下表student:

nameageclass
xiaoming14class1
xiaohuang14class1
xiaoli15class2
xiaochen17class2
xiaobai18class2

我们希望以class分组,每组的信息平铺,效果如下

nameageclass
xiaoming,xiaohuang14,14class1
xiaoli,xiaochen,xiaobai15,17,18class2

分组首先想到的肯定是group by:

select * from student s group by s.class;

我们会发现这样会报错,因为name和age有多个值,这个时候我们就可以使用wm_concat()方法来解决。

   select wm_concat(s.name),wm_concat(s.age),s.class 
     from student s
 gruop by s.class;

但是这个写法又出现了一个新的问题,你会发现name和age这列的结果是

nameageclass
clobclobclass1
clobclobclass2

只需要把wm_concat前面加一个to_char就好了,而且结果就是上面想要的结果。

   select to_char(wm_concat(s.name)) as name,
          to_char(wm_concat(s.age)) as age,
          s.class 
     from student s
 gruop by s.class;

还有一个函数LISTAGG(‘参数一’,’参数二’),这个函数和wm_comcat的作用类似,第一个参数是字段,第二个参数是多个值之间的分隔符,但是用法有些不同,例子如下:

   select listagg(s.name,'-')within group(order by class) as name,
          to_char(wm_concat(s.age)),
          s.class 
     from student s
 gruop by s.class;

结果为:

nameageclass
xiaoming-xiaohuang14,14class1
xiaoli-xiaochen-xiaobai15,17,18class2

name这列的值之间就是以“-”分隔了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值