日常有时候导出数据需求时,数据列会遇到带有分隔符的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. vue slot+传参

    插槽分为默认插槽和具名插槽: 默认插槽: //父组件<div> <h3>父组件</h3> <testChild> <div>默认插槽< ...

  2. Java辅助类持续汇总~

    /** * 01 * 描述:List<String>集合去除重复数据 * [时间 2019年3月5日下午3:54:09 作者 陶攀峰] */ public static List<S ...

  3. Windows -- cmd命令: netstat 和 arp

    1. netstat: 显示网络连接.路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作. 命令格式及参数如下: 2. ARP: 可用于查询本机ARP缓存中IP地址和MAC地址的对应关系.添加 ...

  4. ASP.NET Core 共享第三方依赖库部署的Bug(*.deps.json on 2.2.0 or 4.6.0 版本)

    背景: I try to put the Microsoft.*.dll and System.*.dll togather to a new folder.以便把(第三方或)系统的和应用的dll分开 ...

  5. oracle 简单备注

    1. 建立数据库 备注: 1) oracle 不同于mysql 可以直接create database 2) oracle 创建schema时对应一个用户,即该schema的访问用户,与用户一一对应: ...

  6. ansible基础-优化

    简介 当管理集群达到一定规模时,ansible达到性能瓶颈是难以避免的,此时我们可以通过一定手段提高ansible的执行效率和性能. 笔者虽未管理过超大规模服务器,但也通过查找资料和咨询大神了解了一些 ...

  7. [Swift]LeetCode1035.不相交的线 | Uncrossed Lines

    We write the integers of A and B (in the order they are given) on two separate horizontal lines. Now ...

  8. 使用dom4j 解析xml文件

    //使用dom4j 解析xml文件,升级版,dom4j是对dom的封装 //重点 package com.offcn.utils; import java.io.File; import java.i ...

  9. qml demo分析(clocks-时钟)

    一.效果展示 效果如图1所示,时钟列表支持鼠标左右拖动,带有黑色背景的是晚上时钟,无黑色背景的是白天时钟 二.源码分析 1.main.cpp文件中只包含了一个宏,该宏的具体解释请看qml 示例中的关键 ...

  10. Activity、Fragment、Dialog基类简单整理

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 这里简单记录下Activity.Fragment.Dialog基类中的常规写法,后续根据项目需求进行相应的扩展. BaseActiv ...