多行並一行顯示的兩種方式(DB2)

一、簡介

多行並作一行顯示,在此介紹兩種方式CTE遞歸,和XML函數。表數據如下:

ID NAME HOUSE
1 張三 普通住宅
2 張三 豪華別墅
3 張三 安置房
4 李四 安置房
5 李四 普通住宅

要顯示的結果大約爲:

NAME HOUSE
張三 普通住宅,豪華別墅,安置房
李四 安置房,普通住宅

二、CTE遞歸使用限制

遞歸查詢就是通過對 CTE 自身的引用,從而啓動遞歸邏輯的查詢。遞歸查詢需要遵循以下幾個規則 :
遞歸查詢和初始查詢結果必須包含相同數量的數據列;
遞歸查詢和初始查詢結果數據列的、長度等必須一致;
遞歸查詢不能包含 GROUP BY 或者 HAVING 子句;
遞歸查詢不能包含 Outer Join
遞歸查詢不能包含子查詢 (Subquery);
遞歸查詢必須用 UNION ALL 聯結。

三、通過CTE遞歸方式

--給數據加上序號
with wa_RowNum(id,name,house,rn) as(
        select id,name,house,ROW_NUMBER() OVER(PARTITION BY name) from TTABLE
),
--CTE遞歸拼接house,序號最大的行拼接了所有的house數據
wa_addHouse(id,name,house,rn) as(
        --1作爲遞歸入口
        select wr.id,wr.name,CAST(wr.house AS CLOB),wr.rn from wa_RowNum wr where wr.rn=1
        UNION ALL
        select nt.id,nt.name,CAST(self.house||';'||nt.house AS CLOB),self.rn+1
                from wa_addHouse self,wa_RowNum nt where nt.name=self.name and self.rn+1=nt.rn
),
--過濾掉不需要的數據
wa_getMax(name,house) as(
select name,VARCHAR(house) 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
 
/*

四、XML函數方式

select * from wa_getMax;
select name,
    varchar(replace(replace(replace(xml2clob(xmlagg(xmlelement(NAME a, house||','))),'<A>',''),'</A>',''),'<A/>',''))
from TTABLE group by name


發佈了24 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章