将一列包含多个ID拆分多行

原文:将一列包含多个ID拆分多行

看到个不常见的问题~然后在 Inner Sql Server2008 里面找到一个思路。

如果下面的表结构,如何拆分多行并对应员工号呢?

首先创建测试表

CREATE TABLE Department
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    DepartmentName VARCHAR(50) NULL,
    Members NVARCHAR(500) NULL
)

CREATE TABLE Employee
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    NAME NVARCHAR(50) NULL
)
INSERT INTO Department VALUES
(‘行政‘,‘1,3,5,10,12‘),(‘销售‘,‘42,23,35,40,22‘),(‘市场‘,‘13,17,27,28,43‘)
SELECT * FROM dbo.Department
Employee 表的数据直接用个 Sql Generator生成一下下就好了~
--然后搞个数字辅助表作备用
CREATE TABLE #Num (ID INT)
INSERT INTO #Num
        ( ID )
SELECT TOP 500 ROW_NUMBER() OVER (ORDER BY (SELECT 1))
 FROM sys.objects a,sys.objects b
--为了方便看代码,用个CTE来写。;WITH CTE1 AS
(SELECT a.ID,
        a.DepartmentName,
        a.Members,
        b.ID AS Pos,
        CHARINDEX(‘,‘,a.Members,b.ID) AS NextSplit
    FROM dbo.Department a
        INNER JOIN #Num b
            ON SUBSTRING(‘,‘ + a.Members,b.ID,1) = ‘,‘
            AND b.ID <= LEN(a.Members)
),
CTE2 AS
(SELECT ID,DepartmentName,
        CASE WHEN NextSplit <> 0 THEN SUBSTRING(Members,Pos,NextSplit - Pos)
             ELSE RIGHT(Members,LEN(Members) - Pos + 1) END AS EmployeeID
    FROM CTE1)
SELECT a.* ,b.NAME
    FROM CTE2 a
        INNER JOIN dbo.Employee b ON a.EmployeeID = b.ID

PS: 上述语句其实优化空间是很大的,这里只是提供给一个方法~就暂时不纠结效率上罗~╭(╯3╰)╮

时间: 2024-08-27 01:02:42

将一列包含多个ID拆分多行的相关文章

EL表达式处理字符串 是否 包含 某字符串 截取 拆分...............

EL表达式处理字符串 是否 包含 某字符串 截取 拆分............... JSP页面页头添加<%@ taglib uri="/WEB-INF/taglib/c.tld" prefix="c"%><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>  两个标签页面内容如下: <c:if test=&q

根据一列数据 抽取另一个文件的行数据

方法一: 使用awk处理,先读入文件中的一列数据,然后在第二文件中做判断 awk -F'\t' 'FILENAME=="commUsers_Hotel"{F[$0]=1}FILENAME=="Hotel3"{if($0 in F){print}}' commUsers_Hotel Hotel3 > fugai 根据一列数据 抽取另一个文件的行数据,布布扣,bubuko.com

使用bootstrap table时不能显示筛选列和分页每页显示的行数

使用bootstrap table时不能显示筛选列和分页每页显示的行数 后来在同事的帮助下,才发现没有引用bootstrap的js文件 <script src="/Scripts/bootstrap/js/bootstrap.js"></script> 这个引用了就可以了

MO拆分计划行程序中写入PRODUCTIONORDERS表数据出现重复导致报错(BUG)20180502

错误提示:ORA-00001: 违反唯一约束条件 (ABPPMGR.C0248833319_6192)ORA-06512: 在 "STG.FP_MO_SPLIT", line 199  ORA-06512: 在 "STG.FP_MO_SPLIT", line 1318 错误描述:MO拆分计划行程序中写入PRODUCTIONORDERS表数据出现重复导致报错(BUG) 存储过程:FP_MO_SPLIT 解决方法: 原文地址:https://www.cnblogs.co

【Magicodes.IE 2.0.0-beta1版本发布】已支持数据表格、列筛选器和Sheet拆分

为了更好的完善Magicodes.IE,春节期间我们会进行一次大的重构.由于精力有限,急缺文档和翻译(将文档翻译为英文文档)支持,诚邀各位加入.同时在功能方便也做了相关规划,有兴趣的朋友可以参与提交PR. https://github.com/dotnetcore/Magicodes.IE 2019.01.18 [Nuget]版本更新到2.0.0-beta1 [导出]完全重构整个导出Excel模块并且重写大部分接口 [导出]支持列头筛选器——IExporterHeaderFilter,具体使用见

Excel 若某列包含某个字符则特定列显示特定字符

今天在写Excel , 有很多重复的数据, 在想 如果 可以像Java  一样 筛选就好了 这样的效果 if ("adj".equals(sheet1.A1)){ sheet1.B1 = "adj"; }else if ("asd".equals(sheet.A1)){ sheet1.B1 = "asd"; }else sheet1.B1 = ""; 经过网上查找 B列代码如下 =IF(ISNUMBER(F

kettle列拆分多行运用

kettle列转行是把一个列通过分隔符拆开,转成多行的功能 案列链接: https://pan.baidu.com/s/1i4Zw7VB 1.表输入通过查询数据库,得到输出字段name和password 2.再通过列转行,用"|"把name字段进行分割 3.用文本文件选择字段进行输出测试查看

SqlSever基础 where [] 查找一列中以指定字符开头的行的全部内容

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 code 1 --创建一个数据库 2 create database helloworld1 3 4 --用helloworld1这个数据库 5 use helloworld1 6 7 --创建一个表格teacher 8 create table Teacher 9 ( 10 Id int p

将两个矩阵相乘,A为x行y列的矩阵,B为y行z列的矩阵,A*B

m1*m2=m其中是一个x行z列的一个矩阵,例如 代码如下: #include<stdio.h>void matrix_multiply(int *m1, int *m2, int *m, int x, int y, int z){ int row = 0;  //m矩阵的行 int col = 0;  //m的列 int k = 0; int *m1p = m1;     int *m2p = m2; for (row = 0; row < x; row++) {  for (col