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

2021-06-01 06:31:02 字數 4557 閱讀 7594

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

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

(圖1)

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

(圖2)

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

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

--建立表

ifexists (

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)  

notnull

,[guid] [varchar]  (

50)

null

,[code] [varchar]  (

50)

null

)set

identity_insert [temptable_base]

oninsert [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')

setidentity_insert [temptable_base] off

select

*from [temptable_base]

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

--列值鏈式合併

(圖3)

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

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

二、參考文獻

for xml path 語句的應用

sql多行轉為一列的合併問題,並在sql2000和2005得到驗證

SQL 多行轉一列

1 建立表 create table dbo a id nchar 10 collate chinese prc ci as null,name nchar 10 collate chinese prc ci as null,value nchar 10 collate chinese prc ci...

Sql2005轉Sql2000實用工具

相信大家都有資料庫公升級或者降級的經歷,這裡把資料庫轉化的過程發布一下,方便以後進行資料庫版本的公升級操作。一 從sql2000公升級成sql2005 做法如下 1 把sql server 2000的資料庫backup,做成乙個bak的備份檔案 2 在sql server 2005中新建資料庫,然後...

實用SQL語句

1 將乙個表中的內容拷貝到另外乙個表中 insert intotestt1 a1 b1,c1 selecta,b cfromtest insert intotesttselect fromtest 前提是兩個表的結構完全相同 insert intonotebook id title content ...