zoukankan      html  css  js  c++  java
  • MSSQL将逗号分隔的字符串转换成列显示

    你这个不属于SSIS的范畴,可以说是TSQL范畴.
    这种东西不适合用SSIS来做,每样工具都有自己的优势,如果运用好它们让它们做自己擅长的事才是你应该学习的。
    这里的话你可以这样解,思路如下:
    
    1. 为了能将 aaa,bbb 拆分开,你可以通过 CROSS JOIN的方式来实现。
    2. 为了能够CROSS JOIN你必须要创建几行虚拟行,利用 SQL系统表来创建虚拟行
    3. 虚拟行创建完毕后,利用CROSS JOIN的方式达到根据 有几个 “,”号来拆几行
    4. 完成后就会出现重复的行,也就是说 如果你是 "aa,bb,cc" 这样的情况,那么就有3行数据并且它们的数据一模一样
    5. 使用SUBSTRING 和 CHARINDEX 来根据ID号 来选择要第几个逗号后面的字符
    6. 最终完成
    
    以下是完整TSQL: 可以直接Ctrl+C Ctrl+V 到你的SSMS里执行
    IF OBJECT_ID('Test1') IS NOT NULL DROP TABLE Test1
    GO
    CREATE TABLE Test1(ID varchar(3), [Value] varchar(8))
    INSERT INTO Test1(ID, [Value])
    SELECT 1, 'aa,bb'
    UNION ALL
    SELECT 2, 'cc,dd,ee'
    GO
    
    SELECT ID, SUBSTRING([Value], b.number, CHARINDEX(',', [Value] + ',', b.number)-b.number) AS [Value]
    FROM Test1 a, master..spt_values b
    WHERE
        b.number >= 1 AND b.number < LEN(a.[Value]) AND b.type='P' AND SUBSTRING(',' + [Value] ,number,1) = ','



    原表
    1 aa,bb
    2 cc,dd,ee

    现在
    1 aa
    1 bb
    2 cc
    2 dd
    2 ee
    
    
    表A
    xm xk
    张三 语文,历史,音乐
    李四 体育,语文

    现在想查询得到
    xm xk
    张三 语文
    张三 历史
    张三 音乐
    李四 体育
    李四 语文


    1
    Select 2 a.xm,xk=substring(a.xk,b.number,charindex(',',a.xk+',',b.number)-b.number) 3 from 4 表A a join master..spt_values b 5 ON b.type='p' AND b.number BETWEEN 1 AND LEN(a.xk) 6 where 7 substring(','+a.xk,b.number,1)=','

    --1.将字符串转换为列显示 
    if object_id('tb') is not null drop table tb 
    go 
    create table tb([编号] varchar(3),[产品] varchar(2),[数量] int,[单价] int,[金额] int,[序列号] varchar(8)) 
    insert into tb([编号],[产品],[数量],[单价],[金额],[序列号]) 
    select '001','AA',3,5,15,'12,13,14' union all
    select '002','BB',8,9,13,'22,23,24'
    go 
    select [编号],[产品],[数量],[单价],[金额] 
    ,substring([序列号],b.number,charindex(',',[序列号]+',',b.number)-b.number) as [序列号] 
    from tb a with(nolock),master..spt_values b with(nolock) 
    where b.number>=1 and b.number<=len(a.[序列号]) and b.type='P'
    and substring(','+[序列号],number,1)=','
    go 
    drop table tb 
    go 
    /** 
    编号   产品   数量          单价          金额          序列号 
    ---- ---- ----------- ----------- ----------- -------- 
    001  AA   3           5           15          12 
    001  AA   3           5           15          13 
    001  AA   3           5           15          14 
    002  BB   8           9           13          22 
    002  BB   8           9           13          23 
    002  BB   8           9           13          24 
    */ 
    ---------- 
    --7.将字符串显示为行列 
    if object_id('tb') is not null 
      drop table tb
    create table tb
    (
      id int identity(1,1),
      s nvarchar(100)
    )
    insert into tb(s) select '车位地址1,车位状况1|车位地址2,车位状况2|车位地址n,车位状况n';

    with cte as(   select substring(s,number,charindex('|',s+'|',number)-number) as ss     from tb with(nolock),master..spt_values with(nolock)       where type='P' and number>=1 and number<=len(s) and substring('|'+s,number,1)='|' )
    select left(ss,charindex(',',ss)-1)as s1,substring(ss,charindex(',',ss)+1,len(ss))as s2 from cte;
    drop table tb /** s1 s2 ----------- ------------ 车位地址1 车位状况1 车位地址2 车位状况2 车位地址n 车位状况n
  • 相关阅读:
    AIX 常用命令
    local_listener 与 remote_listener 参数说明
    IBM AIX 5.3 系统管理 系统启动过程详解
    exp/imp 与 expdp/impdp 对比 及使用中的一些优化事项
    local_listener 与 remote_listener 参数说明
    SSH 连接慢 与 反向解析
    Configuring raw devices (multipath) for Oracle Clusterware 10g Release 2 (10.2.0) on RHEL5OEL5 [ID 564580.1]
    Parameter DIRECT: Conventional Path Export Versus Direct Path Export [ID 155477.1]
    AIX 系统介绍
    Oracle 数据文件(Datafile ) 大小 限制 说明
  • 原文地址:https://www.cnblogs.com/yongtaiyu/p/4795255.html
Copyright © 2011-2022 走看看