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)

