您的位置:首页 > 数据库

T_SQL 将一列多行数据合并为一行

2014-10-16 11:17 375 查看
转自:http://www.cnblogs.com/smalleyes/archive/2012/03/08/2385658.html

  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

方法一:用户自定义函数

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)



链接:

FOR XML PATH语句的应用http://it.dianping.com/sql-for-xml-path.htm
Stuff()函数http://msdn.microsoft.com/zh-cn/library/ms188043.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: