相关文章推荐
失恋的牙膏  ·  VBA实战技巧10: ...·  4 月前    · 
傲视众生的鸵鸟  ·  php soap client ...·  1 年前    · 
瘦瘦的小熊猫  ·  GCS获取blob文件名·  1 年前    · 

先演示典型的用法 输入select LISTAGG(姓名,',') WITHIN GROUP(order by 号码 ) as 合并后 from TMP_EXP  即连接姓名字段,用逗号分隔,并按号码来进行排序。可以看到结果5行数据的姓名都合并到一列中了。

还可以结合over(PARTITION BY 字段) 来对结果进行分组,执行语句select   LISTAGG(姓名,',') WITHIN GROUP(order by 号码 ) over(PARTITION BY 性别) as 合并后 from TMP_EXP  按性别字段进行分组,可以看到结果男女都分开了。

不过上一步的结果有重复数据怎么办,可以用distinct 来消除重复数据,执行

select  distinct  LISTAGG(姓名,',') WITHIN GROUP(order by 号码 ) over(PARTITION BY 性别) as 合并后 from TMP_EXP  结果就变成只有两行数据。

另外结合使用group by 方法也能得到跟上一步相同的结果。  执行

select 性别, LISTAGG(姓名,'&') WITHIN GROUP(order by 号码 )  as 合并后 from TMP_EXP group by 性别  按性别字段分组后,再进行字符串连接结果也是两行合并后的数据。

最后还可以研究一些有趣的用法,比如

select 性别, substr(LISTAGG(号码,',') WITHIN GROUP(order by 号码 ),1, instr(LISTAGG(号码,',') WITHIN GROUP(order by 号码 ),',')-1)   as 最靠前号码

from TMP_EXP group by 性别    利用了LISTAGG函数可以排序的特点列举出男女生中最靠前的号码分别是多少。