1. 程式人生 > 其它 >sql語句:db2根據某欄位合併多行資料,將相同組中多行例合併到一個欄位

sql語句:db2根據某欄位合併多行資料,將相同組中多行例合併到一個欄位

技術標籤:db2資料庫sql

原資料
在這裡插入圖片描述
合併後資料

按name欄位分組,合併house,aaa欄位*
在這裡插入圖片描述
合併資料後的缺點就是有重複的的,這個是本人接受不了的,限於技術有限,只能湊合的用了,業務要求多,技術不過關哎。。。

建表

CREATE TABLE ttable
(	id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ,
	name 	varchar(100),
	house 	varchar(100),	
	aaa 	varchar(100),
	PRIMARY KEY (id)
);
INSERT INTO ttABLE(name,house,aaa)
values('張三','美麗','啊'), ('張三','美麗','艾克'), ('張三','天使1','啊'), ('李四','藍天3','看看'), ('張三','定時','第三方'), ('李四','是否','看看'), ('李四','白雲1','中');

方法一:

SELECT 
	MAX(ID),name,
	REPLACE(REPLACE(xml2clob(xmlagg(xmlelement(name A, house || ','))), '<A>', ''), '</A>', '') house,
	REPLACE
(REPLACE(xml2clob(xmlagg(xmlelement(name A, aaa || ','))), '<A>', ''), '</A>', '') aaa FROM ttABLE GROUP BY name

方法二:

--給資料加上序號
with wa_RowNum(id,name,house,aaa,rn) as(
    select id,name,house,aaa,ROW_NUMBER() OVER(PARTITION BY name) from TTABLE
),
--CTE遞迴拼接house,序號最大的行拼接了所有的house資料
wa_addHouse(
id,name,house,aaa,rn) as( select wr.id,wr.name,CAST(wr.house AS CLOB),CAST(wr.aaa AS CLOB),wr.rn from wa_RowNum wr where wr.rn=1 UNION ALL select wrn.id,wrn.name,CAST(wah.house||';'||wrn.house AS CLOB),CAST(wah.aaa||';'||wrn.aaa AS CLOB),wah.rn+1 from wa_addHouse wah,wa_RowNum wrn where wrn.name=wah.name and wah.rn+1=wrn.rn ), --過濾掉不需要的資料 wa_getMax(id,name,house,aaa) as( select id,name,house,aaa from wa_addHouse wa where wa.rn in( select max(iwa.rn) from wa_addHouse iwa where iwa.name=wa.name) ) select * from wa_getMax