博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

合并列值

Posted on 2011-12-05 10:51  itcfj  阅读(185)  评论(0编辑  收藏  举报

合并列值 --*******************************************************************************************表结构,数据如下:
 id value ----- ------ 
1 aa 1 bb 2 aaa 2 bbb 2 ccc 
需要得到结果: id values------ ----------- 
1 aa,bb 2 aaa,bbb,ccc 
即:groupby id, 求 value 的和(字符串相加)
 1. 旧的解决方法(在sql server 2000中只能用函数解决。) --============================================================================
=create table tb(id int, value varchar(10)) 
insertinto tb values(1, 'aa') 
insertinto tb values(1, 'bb') 
insertinto tb values(2, 'aaa')
 insertinto tb values(2, 'bbb') 
insertinto tb values(2, 'ccc') 
go--1. 
创建处理函数 CREATEFUNCTION dbo.f_strUnite(@idint) RETURNSvarchar(8000) ASBEGINDECLARE@strvarchar(8000) SET@str=''SELECT@str=@str+','+ value FROM tb WHERE id=@idRETURNSTUFF(@str, 1, 1, '') END
GO-- 
调用函数 SELECt id, value = dbo.f_strUnite(id) FROM tb GROUPBY id droptable tb dropfunction dbo.f_strUnite go/* id value ----------- ----------- 1 aa,bb 2 aaa,bbb,ccc (所影响的行数为 2 行) */--===================================================================================
2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
 createtable tb(id int, value varchar(10))
 insertinto tb values(1, 'aa') 
insertinto tb values(1, 'bb') 
insertinto tb values(2, 'aaa') insertinto tb values(2, 'bbb') 
insertinto tb values(2, 'ccc') go-- 
查询处理 SELECT*FROM(SELECTDISTINCT id FROM tb)A OUTER APPLY( SELECT[values]=STUFF(REPLACE(REPLACE( ( SELECT value FROM tb N WHERE id = A.id FOR XML AUTO ), ' <N value="', ','), '"/>', ''), 1, 1, '') )
Ndroptable tb 
/* id values ----------- ----------- 1 aa,bb  2 aaa,bbb,ccc (2 行受影响) */
--SQL2005中的方法2
 createtable tb(id int, value varchar(10))
 insertinto tb values(1, 'aa') 
insertinto tb values(1, 'bb')
 insertinto tb values(2, 'aaa') 
insertinto tb values(2, 'bbb') 
insertinto tb values(2, 'ccc') go 
select id, [values]=stuff((select','+[value]from tb t where id=tb.id for xml path('')), 1, 1, '') from tb groupby id 
/* id values ----------- -------------------- 1 aa,bb  2 aaa,bbb,ccc (2 row(s) affected) */