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

Posted 农村的码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于SQL Server含逗号分隔的数据匹配维表的主要内容,如果未能解决你的问题,请参考以下文章

在sql server数据库中查询一个用逗号分隔的字段的问题

Sql Server实现多行数据按分组用逗号分隔成一行数据

SQL Server 2012 列到单行,用逗号分隔

sql server里如何将一组用逗号分隔的字符串分解并插入到另一张表中,比如:11873,27827, 也可能是好多

如何使用 LINQ 查找包含 2 个逗号分隔的字符串的匹配项

VBA:为从 SQL Server 数据库中选择的十进制数获取逗号分隔符而不是点