1. 程式人生 > >SQL Server含逗號分隔的數據匹配維表

SQL Server含逗號分隔的數據匹配維表

標簽 方法 style com nbsp bject pan int entity

日常有時候導出數據需求時,數據列會遇到帶有分隔符的ID,但又需要匹配維表(如下圖所示)將ID變成名稱。

這種情況可以采用“分隔-匹配-合並”的方法

技術分享圖片

具體代碼為:

-- 準備工作1:創建事實表數據
CREATE TABLE #StudentSubject 
(
StuID INT IDENTITY(1,1) NOT NULL,
StuSubject VARCHAR(500) NOT NULL
)
INSERT INTO #StudentSubject(StuSubject) VALUES (1)
INSERT INTO #StudentSubject(StuSubject) VALUES
(2) INSERT INTO #StudentSubject(StuSubject) VALUES (2,3) INSERT INTO #StudentSubject(StuSubject) VALUES (2,3,4) INSERT INTO #StudentSubject(StuSubject) VALUES (1,2,3,4) INSERT INTO #StudentSubject(StuSubject) VALUES (4) -- 準備工作2:創建維表數據 CREATE TABLE #D_Subject ( SubjectID INT IDENTITY
(1,1) NOT NULL, SubjectName VARCHAR(500) NOT NULL ) INSERT INTO #D_Subject(SubjectName) VALUES (語文) INSERT INTO #D_Subject(SubjectName) VALUES (數學) INSERT INTO #D_Subject(SubjectName) VALUES (英語) INSERT INTO #D_Subject(SubjectName) VALUES (體育) SELECT * FROM #StudentSubject SELECT
* FROM #D_Subject ; -- 1分離:將逗號分隔的StuSubject分離匹配StudentSubject獲取標簽 WITH CetSubject AS ( SELECT StuID, CAST(LEFT(StuSubject, CHARINDEX(,, StuSubject + ,) - 1) AS NVARCHAR(100)) SubjectID, CAST(STUFF(StuSubject + ,, 1, CHARINDEX(,, StuSubject + ,), ‘‘) AS NVARCHAR(100)) Split FROM #StudentSubject UNION ALL SELECT StuID, CAST(LEFT(Split, CHARINDEX(,, Split) - 1) AS NVARCHAR(100)) SIds, CAST(STUFF(Split, 1, CHARINDEX(,, Split), ‘‘) AS NVARCHAR(100)) Split FROM CetSubject WHERE split > ‘‘ ) -- 2匹配 將分離後的數據逐行與維表匹配 SELECT CS.StuID, DS.SubjectName INTO #CetSubjectName FROM CetSubject CS LEFT JOIN #D_Subject DS ON DS.SubjectID = CS.SubjectID WHERE CS.SubjectID <> ‘‘ OPTION (MAXRECURSION 0); -- 3合並 將與維表匹配的結果用逗號分隔合並還原 SELECT StuID, STUFF((SELECT , + T.SubjectName FROM #CetSubjectName T WHERE T.StuID = T2.StuID FOR XML PATH(‘‘)),1,1,‘‘) SubjectName FROM #CetSubjectName t2 GROUP BY StuID DROP TABLE #D_Subject DROP TABLE #StudentSubject DROP TABLE #CetSubjectName

SQL Server含逗號分隔的數據匹配維表