码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server含逗号分隔的数据匹配维表

时间:2019-03-16 12:28:37      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:HERE   not   数据   path   XML   还原   subject   info   value   

日常有时候导出数据需求时,数据列会遇到带有分隔符的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含逗号分隔的数据匹配维表

标签:HERE   not   数据   path   XML   还原   subject   info   value   

原文地址:https://www.cnblogs.com/kylan/p/10541653.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!