Oracle、SqlServer中合并列

来源:互联网 发布:域名备案有什么好处 编辑:程序博客网 时间:2024/05/17 08:05

Oracle中合并一列的方法:WMSYS.WM_CONCAT

使用介绍:

TableA:列1  列2

1 a

1 b

2 b

2 c

查询:select 列1,WMSYS.WM_CONCAT(列2) AS 列2   from TableA

结果为:列1   列2

1 a,b

2 b,c

SqlServer中合并一列的方法:dbo.f_strUnite

表结构,数据如下: id value  

1 aa 

1 bb

2 aaa 

2 bbb 

2 ccc  

需要得到结果: idvalues  

1 aa,bb  

2 aaa,bbb,ccc 即:groupby id, 求 value 的和(字符串相加)  

1. 旧的解决方法(在sql server 2000中只能用函数解决。) 

createtable tb(idint, valuevarchar(10)) 

insertinto tbvalues(1,'aa')  

insertinto tbvalues(1,'bb')  

insertinto tbvalues(2,'aaa')  

insertinto tbvalues(2,'bbb')  

insertinto tbvalues(2,'ccc')go  

--1. 创建处理函数 CREATEFUNCTION dbo.f_strUnite(@idint)RETURNSvarchar(8000)ASBEGINDECLARE@strvarchar(8000)SET@str=''SELECT@str=@str+','+ valueFROM tbWHERE id=@idRETURNSTUFF(@str,1,1,'')ENDGO  

-- 调用函数 SELECt id, value = dbo.f_strUnite(id) FROM tb GROUPBY iddroptable tbdropfunction dbo.f_strUnitego 

/* id value ----------- ----------- 1 aa,bb 2 aaa,bbb,ccc (所影响的行数为 2 行) */ 

2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)

createtable tb(idint, valuevarchar(10))  

insertinto tbvalues(1,'aa')  

insertinto tbvalues(1,'bb')  

insertinto tbvalues(2,'aaa')  

insertinto tbvalues(2,'bbb')  

insertinto tbvalues(2,'ccc')go  

-- 查询处理 SELECT*FROM(SELECTDISTINCT idFROM tb)AOUTER APPLY(SELECT[values]=STUFF(REPLACE(REPLACE( ( SELECT valueFROM tb NWHERE id= A.idFOR XML AUTO ), ' <N value="',','),'"/>',''),1,1,'') )Ndroptable tb/* id values ----------- ----------- 1 aa,bb 2 aaa,bbb,ccc (2 行受影响) */--SQL2005中的方法2createtable tb(idint, valuevarchar(10))insertinto tbvalues(1,'aa')insertinto tbvalues(1,'bb')insertinto tbvalues(2,'aaa')insertinto tbvalues(2,'bbb')insertinto tbvalues(2,'ccc')goselect id,[values]=stuff((select','+[value]from tb twhere id=tb.idfor xml path('')),1,1,'')from tbgroupby id/* id values ----------- -------------------- 1 aa,bb 2 aaa,bbb,ccc (2 row(s) affected)*/


转载地址:http://343766868.blog.163.com/blog/static/483140562011384122463/


0 0
原创粉丝点击