多语言展示
当前在线:801今日阅读:23今日分享:25

如何用Oracle字符串连接函数ListAgg实现行转列?

LISTAGG( )函数是Oracle 11g后推出的字符串连接函数,功能与之前版本的WMSYS.WM_CONCAT( )函数类似。基本语法为LISTAGG(字段名,'连接符') WITHIN GROUP( ORDER BY 字段名),返回varchar2类型的值。
工具/原料
1

Oracle 11g

2

PL/SQL

方法/步骤
1

先准备一下些测试数据用于演示,本例中有号码,姓名,性别三个字段共5行数据。

2

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

3

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

4

不过上一步的结果有重复数据怎么办,可以用distinct 来消除重复数据,执行select  distinct  LISTAGG(姓名,',') WITHIN GROUP(order by 号码 ) over(PARTITION BY 性别) as 合并后 from TMP_EXP  结果就变成只有两行数据。

5

另外结合使用group by 方法也能得到跟上一步相同的结果。  执行select 性别, LISTAGG(姓名,'&') WITHIN GROUP(order by 号码 )  as 合并后 from TMP_EXP group by 性别  按性别字段分组后,再进行字符串连接结果也是两行合并后的数据。

6

最后还可以研究一些有趣的用法,比如 select 性别, substr(LISTAGG(号码,',') WITHIN GROUP(order by 号码 ),1, instr(LISTAGG(号码,',') WITHIN GROUP(order by 号码 ),',')-1)   as 最靠前号码 from TMP_EXP group by 性别    利用了LISTAGG函数可以排序的特点列举出男女生中最靠前的号码分别是多少。

注意事项

由于返回值为Varchar2,连接的字符串切勿超长

推荐信息