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)