sql server 中拥有相同字段值的记录某个字段合并问题解答

时间:2022-03-22 15:09:01

一、问题

有表如下:

sql server 中拥有相同字段值的记录某个字段合并问题解答

如何获得如下结果:

sql server 中拥有相同字段值的记录某个字段合并问题解答

二、解法一

使用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

三、说明

这里合并的字段都是字符串,下一次我会讨论如何对整形数字求和。