SQL Server在进行数据迁移和报表处理的时候会遇到将一列多行数据拼接为一个字符串的状况,为了处理这个问题,在网上找了一些相关的资料,提供两种方法,供遇到相似问题的朋友们参考,也借此加深本身的印象。函数
Table:SCpost
Studentspa |
Course3d |
张三blog |
大学语文ci |
李四字符串 |
大学语文it |
张三table |
书法鉴赏class |
张三 |
音乐欣赏 |
李四 |
电影赏析 |
指望获得的结果:
Student |
Course |
张三 |
大学语文,书法鉴赏,音乐欣赏 |
李四 |
大学语文,电影赏析 |
IF OBJECT_ID(N'SC') IS NOT NULL
BEGIN
DROP TABLE SC
END
ELSE
BEGIN
CREATE TABLE SC
(
Student NVARCHAR(50),
Course NVARCHAR(50)
)
INSERT INTO SC
SELECT N'张三',N'大学语文' UNION ALL
SELECT N'李四',N'大学语文' UNION ALL
SELECT N'张三',N'书法鉴赏' UNION ALL
SELECT N'张三',N'音乐赏析' UNION ALL
SELECT N'李四',N'电影赏析'
END
GO
(5 row(s) affected)
s
方法一:用户自定义函数
CREATE FUNCTION FN_Merge (@Student NVARCHAR(50))
RETURNS NVARCHAR(50)
AS
BEGIN
DECLARE @Course NVARCHAR(50)
SELECT @Course = ISNULL(@Course + ',','') + @Course
FROM SC
WHERE Student = @Student
RETURN @COURSE
END
SELECT DISTINCT [Student]
,dbo.FN_Merge([Student]) AS Course
FROM [dbo].[SC]
结果:
(2 row(s) affected)
方法二:FOR XML PATH
SELECT DISTINCT [Student]
,STUFF(
(
SELECT ','+[Course]
FROM [dbo].[SC]
WHERE Student = A.Student
FOR XML PATH('')
)
,1,1,''
)AS Course
FROM [dbo].[SC] AS A
结果:
(2 row(s) affected)