日常有时候导出数据需求时,数据列会遇到带有分隔符的ID,但又需要匹配维表(如下图所示)将ID变成名称。

这种情况可以采用“分隔-匹配-合并”的方法

具体代码为:

-- 准备工作1:创建事实表数据
CREATE TABLE #StudentSubject
(
StuID INT IDENTITY(1,1) NOT NULL,
StuSubject VARCHAR(500) NOT NULL
)
INSERT INTO #StudentSubject(StuSubject) VALUES ('')
INSERT INTO #StudentSubject(StuSubject) VALUES ('')
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 ('') -- 准备工作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含逗号分隔的数据匹配维表的更多相关文章

  1. sql server 中 like 中文不匹配问题解决就这么简单

    原文:sql server 中 like 中文不匹配问题解决就这么简单 MS-SQL Server select * from Book where BookName like'%C语言%'  在SQ ...

  2. 恢复SQL Server被误删除的数据(再扩展)

    恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...

  3. 恢复SQL Server被误删除的数据

    恢复SQL Server被误删除的数据 <恢复SQL Server被误删除的数据(再扩展)> 地址:http://www.cnblogs.com/lyhabc/p/4620764.html ...

  4. SQL SERVER 和ACCESS的数据导入导出

            //批量导入Access         string filepath = Server.MapPath("student.mdb");         stri ...

  5. .SQL Server中 image类型数据的比较

    原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...

  6. [转]实战 SQL Server 2008 数据库误删除数据的恢复

    实战 SQL Server 2008 数据库误删除数据的恢复 关键字:SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我,他用delete ...

  7. SQL Server 2008 数据库误删除数据的恢复

    原文:SQL Server 2008 数据库误删除数据的恢复 原文:http://www.cnblogs.com/dudu/archive/2011/10/15/sql_server_recover_ ...

  8. SQL Server 2008 批量插入数据时报错

    前几天在SQL Server 2008同步产品数据时,总是提示二进制文本被截断的错误,但是经过检查发现数据都符合格式要求. 百思不得其解,单独插入一条条数据则可以插入,但是批量导入则报错. 批量导入代 ...

  9. C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

    C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...

随机推荐

  1. 学习python的第一天

    2019.4.25自我总结 一.Typora 关于用Typora 自我感觉良好,基本快捷键也比较简单,ps:还是要多用用 二.编程 1.编程语言 是用来定义计算机程序的形式语言.它是一种被标准化的交流 ...

  2. 接口以及 LeetCode 每日一题

    1 接口 1.1 接口的概念 接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心类内方法的实现细节,只是规定这批类里面必须提供某些方法.所以接口体现的是规范和实现分离的设计哲 ...

  3. QT文件操作

    /* 写文件 */ QFile file(filePath); bool bo = file.open(QIODevice::WriteOnly | QIODevice::Append); //qDe ...

  4. Ginger的第一篇博客

    怀着无感的心情,没有技术的身体,写下第一篇博客作为标记. 目前应该会搞清楚数据结构上相关的操作.算法,然后用c语言实现后记录在博客. 我是有目标的咸鱼! 2019/4/19

  5. TensorFlow 2.0 Alpha pip安装指令

    TensorFlow 2.0 Alpha目前已经可以通过pip安装,亲测有效,安装指令为: # 普通版本 pip install tensorflow==2.0.0-alpha0 # GPU版本 pi ...

  6. shell编写小技巧整理

    1. if和else语句可以进行嵌套.if的条件判断部分可能会变得很长,可以使用逻辑运算符将它变得简洁一些. [ condition ] && action :如果condition为 ...

  7. 面向对象(__item__)

    #Author : Kelvin #Date : 2019/1/20 21:37 class People: def __getitem__(self, item): print("geti ...

  8. Capacitor 新一代混合应用“神器” 会代替Cordova吗??

    1.介绍or畅想 Capacitor是由ionic团队最新开发维护的一个跨平台的应用程序容器,可以轻松构建在iOS,Android,Electron 和 Web 上本机运行的Web应用程序.我们称这些 ...

  9. 《前端之路》之 operator 操作符的优先级

    Github传送门,欢迎 Star - - Github地址,欢迎 Star

  10. Asp.Net Core 轻松学-利用日志监视进行服务遥测

    前言     在 Net Core 2.2 中,官方文档表示,对 EventListener 这个日志监视类的内容进行了扩充,同时赋予了跟踪 CoreCLR 事件的权限:通过跟踪 CoreCLR 事件 ...