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)) SplitFROM #StudentSubjectUNION ALL SELECT StuID,CAST(LEFT(Split, CHARINDEX(',', Split) - 1) AS NVARCHAR(100)) SIds,CAST(STUFF(Split, 1, CHARINDEX(',', Split), '') AS NVARCHAR(100)) SplitFROM CetSubjectWHERE split > '' ) -- 2匹配 将分离后的数据逐行与维表匹配 SELECT CS.StuID,DS.SubjectNameINTO #CetSubjectNameFROM CetSubject CSLEFT 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,'') SubjectNameFROM #CetSubjectName t2GROUP BY StuIDDROP TABLE #D_Subject DROP TABLE #StudentSubject DROP TABLE #CetSubjectName
转载于:https://www.cnblogs.com/kylan/p/10541653.html
SQL Server含逗号分隔的数据匹配维表相关推荐
- sql server 2008 导入导出数据大全
/******* 导出到excel EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q - S&quo ...
- [转]实战 SQL Server 2008 数据库误删除数据的恢复
实战 SQL Server 2008 数据库误删除数据的恢复 关键字:SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我,他用delete ...
- 转载-SQL Server各种导入导出数据方式的比较
注:本文转载自 http://blog.csdn.net/nokiaguy/article/details/4684822 当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新 ...
- [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE
需要在c盘下先建立一个data.txt文件,然后在文件的第一行写上你要导出的列,不如说要导出id和name这两列,就在第一行写上 id,name 然后保存,使用下列SQL就可以了,你如果要保持原有的I ...
- 恢复SQL Server被误删除的数据(再扩展)
原文:恢复SQL Server被误删除的数据(再扩展) 恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是 ...
- 恢复SQL Server被误删除的数据
恢复SQL Server被误删除的数据 <恢复SQL Server被误删除的数据(再扩展)> 地址:http://www.cnblogs.com/lyhabc/p/4620764.html ...
- sql server left join 重复数据原因图
sql server left join 重复数据原因图 网购从这里开始 ( 物美价廉还等什么?!!! )
- SQL Server 2000安装指南及数据创建
SQL Server 是一个关系数据库管理系统,它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本.在Windows NT ...
- SQL Server 2008 批量插入数据时报错
前几天在SQL Server 2008同步产品数据时,总是提示二进制文本被截断的错误,但是经过检查发现数据都符合格式要求. 百思不得其解,单独插入一条条数据则可以插入,但是批量导入则报错. 批量导入代 ...
最新文章
- LeetCode 217 Contains Duplicate--python,java解法--set--简单
- python 网络通讯 plc_PLC与PC网络通信实验
- Spring Boot - 自动配置实例解读
- SpringBoot 包含处理
- Linux统计文件行数、字数、字节数
- 飞鸽传书2012绿色版下载
- RHEL5下构建Snort网络***检测系统
- 【转】Delphi实现自动发贴和识别验证码 王泽宾
- C 字符串转换为c语言字符串,OC字符串与C语言字符串之间的相互转换
- linq判断集合中相同元素个数_高中数学:集合与函数概念知识点汇总
- ESP8285与ESP8266的差异
- 阿里Maven仓库不限容量,免费用
- tp php websocket教程,tp6 websocket方法详解
- 聊一聊,android程序员前景如何
- 淘宝运营 淘宝客的模式 、优点以及推广方案
- C语言中关于二进制的换算
- 生命苍白无力时候遇到你,即使再难也要亲手绘出五彩生活――读《平庸的世界》有感...
- Typescript系列(一):TS入门教程之简介、安装、编译、监听
- 正则校验必须由数字 字母 和 特殊符号组成的正则
- 写一个函数找出一个整数数组中,第二大的数
热门文章
- python装饰器由浅入深_详解Python装饰器由浅入深
- NOI数学之提高级:欧拉定理和欧拉函数
- RTX5 | 事件标志组01 - 创建事件标志组
- 浏览器填写数据,跳转页面返回数据不消失
- layui结合form,table的全选、反选v1.0
- 阿里云 mysql 双主_mysql数据库一主两从
- Qt文档阅读笔记-void QObject::deleteLater()解析
- Linux笔记-使用crontab定时调用sh文件
- asc码转换 linux_Linux终端下将图片转换ASCII Art代码图案
- java设置等待锁的时间_java的锁池和等待池