SQL Server在进行数据迁移和报表处理的时候会遇到将一列多行数据拼接为一个字符串的情况,为了处理这个问题,在网上找了一些相关的资料,提供两种方法,供遇到类似问题的朋友们参考,也借此加深自己的印象。
Table:SC
Student |
Course |
张三 |
大学语文 |
李四 |
大学语文 |
张三 |
书法鉴赏 |
张三 |
音乐欣赏 |
李四 |
电影赏析 |
期望得到的结果:
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
方法一:用户自定义函数(如果是双主键时会有问题,需要传两个主建参数进去。比方说班级,小组,人员这三个主建,不能通过只传班级ID进去然后按小级分级,而需要传班级与小组这两个主建做为参数然后作为条件查询。暂没想到解决方法)
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 (SQL2005以上版本可以用,SQL2000的请用方法一)
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)
转自:http://www.cnblogs.com/smalleyes/archive/2012/03/08/2385658.html