一、資料庫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...