一、问题
有表如下:
如何获得如下结果:
二、解法一
使用xml转换
代码如下:
CREATE TABLE body ( ID int, BODY nvarchar(20) ) go INSERT INTO body VALUES(1,'aaaa') INSERT INTO body VALUES(2,'bbbb') INSERT INTO body VALUES(1,'cccccc') INSERT INTO body VALUES(3,'ddddd') go SELECT * FROM body SELECT distinct a.ID,stuff((SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('')),1,1,'') AS BODY FROM body a --具体思路是这样的: SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('') --这条语句的作用是按照a中的ID查找body表中ID=a.ID的所有记录,并把它转换成一个xml(关于将查询集转换成xml的文章, --博客园有很多的,你可以去看看) stuff((SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('')),1,1,'') --这条语句的作用是把生成的xml前面的一个逗号去掉并转化成标量值 --最后用一个distinct去掉重复的记录
解法二
使用游标,这里我定义了一个函数,你也可以改成存储过程之类的
USE MyTest go --自定义函数根据ID返回连接后的body(我的数据库名叫body) CREATE FUNCTION Getresult(@id int) RETURNS nvarchar(20) AS BEGIN DECLARE @resultstr nvarchar(100),@tempstr nvarchar(20) DECLARE @tempid int DECLARE mycursor CURSOR FOR SELECT * FROM body OPEN mycursor FETCH next FROM mycursor INTO @tempid,@tempstr WHILE (@@FETCH_STATUS=0) BEGIN IF(@tempid=@id) BEGIN SET @tempstr=stuff(@tempstr,1,0,',') SET @resultstr=stuff(@tempstr,1,0,@resultstr) END FETCH next FROM mycursor INTO @tempid,@tempstr END SET @resultstr=STUFF(@resultstr,1,1,'') CLOSE mycursor DEALLOCATE mycursor RETURN (@resultstr) END --函数建好后,执行以下SQL语句 SELECT distinct m.ID, dbo.Getresult(m.ID) AS BODY FROM body AS m
三、说明
这里合并的字段都是字符串,下一次我会讨论如何对整形数字求和。