DB2同一字段字符多条记录合并
2018-03-05 08:55
691 查看
DB2将多行记录合并成一行
如:
CREATE TABLE LX_TMP1(ID VARCHAR(100),OLDNAME VARCHAR(100));
INSERT INTO LX_TMP1 VALUES('LUYONG','A');
INSERT INTO LX_TMP1 VALUES('LUYONG','B');
INSERT INTO LX_TMP1 VALUES('LU','1');
INSERT INTO LX_TMP1 VALUES('LU','3');
INSERT INTO LX_TMP1 VALUES('LU','5');
合并后效果如下:
LU 1,3,5
LUYONG A,B
有两种方法:
1、利用XML方法,百度多数说的是这种方法,前提是数据库支持XML
select ID,replace(replace(xml2clob(xmlagg(xmlelement(NAME A, OLDNAME||','))),'<A>',''),'</A>','') FROM
LX_TMP1 GROUP BY ID;
结果:
LU 1,3,5,
LUYONG A,B,
说明:按ID列归类,"NAME A" 与 '<A>' 这两个A必须相同,OLDNAME是要连接的列。
2、利用递归方法
WITH LX_TMP2(ID,NEWOLDNAME,SN)
AS (
SELECT ID,OLDNAME,SN
FROM
(SELECT ID,OLDNAME,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY OLDNAME ) AS SN FROM LX_TMP1 ) WHERE SN = 1
UNION ALL
SELECT T1.ID,T1.OLDNAME||','||T2.NEWOLDNAME AS NEWOLDNAME,T1.SN
FROM
(SELECT ID,OLDNAME,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY OLDNAME ) AS SN FROM LX_TMP1 ) T1,
LX_TMP2 T2
WHERE T1.ID = T2.ID AND T1.SN = T2.SN + 1
)
SELECT ID,NEWOLDNAME FROM LX_TMP2 WHERE (ID,SN) IN
(
SELECT ID,MAX(SN)
FROM LX_TMP2
GROUP BY ID
);
结果:
LU 5,3,1
LUYONG B,A
说明:此方法是利用递归根据ID分类,然后标识序列,再根据序列把相同的字段字符相连。此方法还可以根据需求,排序相同字段的连接顺序。
如:
CREATE TABLE LX_TMP1(ID VARCHAR(100),OLDNAME VARCHAR(100));
INSERT INTO LX_TMP1 VALUES('LUYONG','A');
INSERT INTO LX_TMP1 VALUES('LUYONG','B');
INSERT INTO LX_TMP1 VALUES('LU','1');
INSERT INTO LX_TMP1 VALUES('LU','3');
INSERT INTO LX_TMP1 VALUES('LU','5');
合并后效果如下:
LU 1,3,5
LUYONG A,B
有两种方法:
1、利用XML方法,百度多数说的是这种方法,前提是数据库支持XML
select ID,replace(replace(xml2clob(xmlagg(xmlelement(NAME A, OLDNAME||','))),'<A>',''),'</A>','') FROM
LX_TMP1 GROUP BY ID;
结果:
LU 1,3,5,
LUYONG A,B,
说明:按ID列归类,"NAME A" 与 '<A>' 这两个A必须相同,OLDNAME是要连接的列。
2、利用递归方法
WITH LX_TMP2(ID,NEWOLDNAME,SN)
AS (
SELECT ID,OLDNAME,SN
FROM
(SELECT ID,OLDNAME,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY OLDNAME ) AS SN FROM LX_TMP1 ) WHERE SN = 1
UNION ALL
SELECT T1.ID,T1.OLDNAME||','||T2.NEWOLDNAME AS NEWOLDNAME,T1.SN
FROM
(SELECT ID,OLDNAME,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY OLDNAME ) AS SN FROM LX_TMP1 ) T1,
LX_TMP2 T2
WHERE T1.ID = T2.ID AND T1.SN = T2.SN + 1
)
SELECT ID,NEWOLDNAME FROM LX_TMP2 WHERE (ID,SN) IN
(
SELECT ID,MAX(SN)
FROM LX_TMP2
GROUP BY ID
);
结果:
LU 5,3,1
LUYONG B,A
说明:此方法是利用递归根据ID分类,然后标识序列,再根据序列把相同的字段字符相连。此方法还可以根据需求,排序相同字段的连接顺序。
相关文章推荐
- mysql合并多条记录的单个字段去一条记录
- [MySQL] MySQL将多条记录的某个字段合并成一条记录
- mysql合并多条记录的单个字段去一条记录编辑
- Oracle中将一条记录(某字段中为合并的信息)拆分成多条记录
- MySQL数据库将多条记录的单个字段合并成一条记录
- postgresql将多条记录合并为一个字符或者反之
- MySQL数据库将多条记录的单个字段合并成
- 在SQL语句中查询多条记录并把多条记录同一字段的值连接成一个字符并返回的写法
- mysql合并多条记录的单个字段去一条记录编辑
- MySQL数据库将多条记录的单个字段合并成一条记录
- MySQL数据库将多条记录的单个字段合并成一条记录
- 合并多条记录的同一字段值SQL语句
- 合并多条记录的同一字段值SQL语句
- 合并多条记录的同一字段值SQL语句
- 合并两张表并过滤两个字段其字符相同(ab=ba)的记录
- ORACLE如何将多条记录合并成一个字段
- SQL 拼接多个字段的值&一个字段多条记录的拼接
- SQL--合并多条记录为一条记录