在db2中遇到多行一列转为一行一列的需求时,用db2函数 LISTAGG可以实现该功能。语法如下:
SELECT
[分组的字段 ] , LISTAGG([需要聚合的字段名], ',')
FROM [表名]
GROUP BY [分组的字段名] ;
设计以下实验,阐述该函数实现行转列的方法。
步骤1:用sql构造一张临时表数据如下:
select * from ( values
('1', 'aa'),
('1', 'bb'),
('1', 'cc'),
('2', 'aa'),
('2', 'bb'),
('3', 'aa')
) as table_test(id,name) ;
步骤2.转换前查询数据返回结果
ID NAME
1 aa
1 bb
1 cc
2 aa
2 bb
3 aa
步骤3.用函数转换后,语法如下
select
S.id
,listagg(S.name , ',') as name_new
from
(
select * from ( values
('1', 'aa'),
('1', 'bb'),
('1', 'cc'),
('2', 'aa'),
('2', 'bb'),
('3', 'aa')
) as table_test(id,name)
) S
group by S.id;
查询返回值如下:
ID NAME_NEW
1 aa ,bb ,cc
2 aa ,bb
3 aa
多列值合并已实现。
注意:
1.此实验用步骤1的sql语句当做数据表,真实环境替换为表名即可。
2.以上方法在db2数据库本人亲测有效,暂不确定其它类型数据库是否支持此函数,其它数据库行转列操作方法后续更新。