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


日常有時候導出數據需求時,數據列會遇到帶有分隔符的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM