SQL Server含逗號分隔的數據匹配維表
阿新 • • 發佈:2019-03-16
標簽 方法 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含逗號分隔的數據匹配維表