sql多行轉為一列的合併

2022-03-26 08:33:22 字數 3996 閱讀 1976

一、資料庫sql server列值鏈式合併

需求:原始表的資料的結構如圖1所示,把相同guid的code值生成乙個鏈式字串。

(圖1)

目標:我們希望達到的效果如圖2所示,這裡的guid變成唯一的了,這行的記錄中包含了這個guid所對應的code字段值的鏈式字串。

(圖2)

分析與實現:要實現圖1到圖2的轉變,這使用sql server 2005的新功能:xml,下面我們來講講具體的實現:

首先我們先建立乙個測試表,方便後面的效果展現;

--建立表

if exists (select * from sysobjects where id = object_id('[temptable_base]') and objectproperty(id, 'isusertable') = 1) 

drop table [temptable_base]

create table [temptable_base] (

[id] [int]  identity (1, 1)  not null,

[guid] [varchar]  (50) null,

[code] [varchar]  (50) null)

set identity_insert [temptable_base] on

insert [temptable_base] ([id],[guid],[code]) values ( 1,'91e92dcb-141a-30b2-e6cd-b59eabd21749','a')

insert [temptable_base] ([id],[guid],[code]) values ( 2,'91e92dcb-141a-30b2-e6cd-b59eabd21749','c')

insert [temptable_base] ([id],[guid],[code]) values ( 3,'91e92dcb-141a-30b2-e6cd-b59eabd21749','e')

insert [temptable_base] ([id],[guid],[code]) values ( 4,'91e92dcb-141a-30b2-e6cd-b59eabd21749','o')

insert [temptable_base] ([id],[guid],[code]) values ( 5,'91e92dcb-141a-30b2-e6cd-b59eabd21749','g')

insert [temptable_base] ([id],[guid],[code]) values ( 6,'79dd7ab9-ce57-9431-b020-df99731fc99d','a')

insert [temptable_base] ([id],[guid],[code]) values ( 7,'79dd7ab9-ce57-9431-b020-df99731fc99d','o')

insert [temptable_base] ([id],[guid],[code]) values ( 8,'79dd7ab9-ce57-9431-b020-df99731fc99d','e')

insert [temptable_base] ([id],[guid],[code]) values ( 9,'79dd7ab9-ce57-9431-b020-df99731fc99d','f')

insert [temptable_base] ([id],[guid],[code]) values ( 10,'79dd7ab9-ce57-9431-b020-df99731fc99d','o')

insert [temptable_base] ([id],[guid],[code]) values ( 11,'79dd7ab9-ce57-9431-b020-df99731fc99d','b')

insert [temptable_base] ([id],[guid],[code]) values ( 12,'79dd7ab9-ce57-9431-b020-df99731fc99d','d')

insert [temptable_base] ([id],[guid],[code]) values ( 13,'79dd7ab9-ce57-9431-b020-df99731fc99d','f')

insert [temptable_base] ([id],[guid],[code]) values ( 14,'d61651d9-1b0a-0362-ee91-a805aa3e08f2','o')

insert [temptable_base] ([id],[guid],[code]) values ( 15,'d61651d9-1b0a-0362-ee91-a805aa3e08f2','d')

insert [temptable_base] ([id],[guid],[code]) values ( 16,'d61651d9-1b0a-0362-ee91-a805aa3e08f2','f')

insert [temptable_base] ([id],[guid],[code]) values ( 17,'d61651d9-1b0a-0362-ee91-a805aa3e08f2','c')

insert [temptable_base] ([id],[guid],[code]) values ( 18,'d61651d9-1b0a-0362-ee91-a805aa3e08f2','u')

insert [temptable_base] ([id],[guid],[code]) values ( 19,'d61651d9-1b0a-0362-ee91-a805aa3e08f2','f')

insert [temptable_base] ([id],[guid],[code]) values ( 20,'4802f0cd-b53f-a3f5-1c78-2d7424579c06','a')

insert [temptable_base] ([id],[guid],[code]) values ( 21,'3ccbff9f-827b-6639-4780-da7215166728','o')

insert [temptable_base] ([id],[guid],[code]) values ( 22,'3ccbff9f-827b-6639-4780-da7215166728','m')

insert [temptable_base] ([id],[guid],[code]) values ( 23,'3ccbff9f-827b-6639-4780-da7215166728','c')

insert [temptable_base] ([id],[guid],[code]) values ( 24,'3ccbff9f-827b-6639-4780-da7215166728','m')

set identity_insert [temptable_base] off

select * from [temptable_base]

使用sql server2005的for xml path把記錄資料以xml的格式組織起來,把同乙個guid的資料進行字串的拼湊。執行下面的sql就可以達到圖3所示的效果了。 

--列值鏈式合併

select  b.guid,left(userlist,len(userlist)-1) as paths from (

select guid,

(select code+',' from temptable_base where guid=a.guid order by id for xml path('')) as userlist

from temptable_base a 

group by guid

) b(圖3)

3.      上面的sql語句的意思是:

假設以guid為91e92dcb-141a-30b2-e6cd-b59eabd21749為例,那麼guid=a.guid就是先找出值為91e92dcb-141a-30b2-e6cd-b59eabd21749的記錄,並進行order by id的排序,拿出了這5行記錄以逗號的形式生成鏈式字串(for xml path(''))。

sql多行轉為一列的合併問題

描述 將如下形式的資料按id欄位合併value欄位。id value 1 aa 1 bb 2 aaa 2 bbb 2 ccc 需要得到結果 id value 1 aa,bb 2 aaa,bbb,ccc 即 group by id,求 value 的和 字串相加 1 sql2000中只能用自定義的函式...

轉 簡單實用SQL指令碼 SQL多行轉為一列

一 資料庫sql server列值鏈式合併 需求 原始表的資料的結構如圖1所示,把相同guid的code值生成乙個鏈式字串。圖1 目標 我們希望達到的效果如圖2所示,這裡的guid變成唯一的了,這行的記錄中包含了這個guid所對應的code字段值的鏈式字串。圖2 分析與實現 要實現圖1到圖2的轉變,...

一列多行合併一列一行

方法1 定義臨時的varchar變數,通過游標一條條讀取,然後在迴圈中改變臨時變數的值最終輸出 關於游標的方法,這裡再敘述。sql2008中的方法 create table tb id int,value varchar 10 insert into tb values 1,aa insert in...