Sql server 使用Split函数重构SQL表

Sql server 使用Split函数重构SQL表,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我目前正在尝试学习拆分函数以及如何实际使用拆分函数。我有一张需要拆分的桌子,我认为我需要使用拆分(因此尝试学习)。然而,我对如何让它工作感到困惑 使用excel作为第一组数据的模型是它的样子。第二盘是我想要的结果。 有人能帮忙吗?对每一列使用a,然后使用a组合结果,以正确的方式检索值 select P.SaveName, P.Para1, P.Para2, P.Para3, P.Para4, P.Para5, P.Para6 from ( select T.SaveName, S.I

我目前正在尝试学习拆分函数以及如何实际使用拆分函数。我有一张需要拆分的桌子,我认为我需要使用拆分(因此尝试学习)。然而,我对如何让它工作感到困惑

使用excel作为第一组数据的模型是它的样子。第二盘是我想要的结果。

有人能帮忙吗?

对每一列使用a,然后使用a组合结果,以正确的方式检索值

select P.SaveName, P.Para1, P.Para2, P.Para3, P.Para4, P.Para5, P.Para6
from (
     select T.SaveName, S.ID, S.Item, S.Para
     from YourTable as T 
       cross apply (select ID, Item, 'Para1' from dbo.SplitString(T.Para1, ',') union all
                    select ID, Item, 'Para2' from dbo.SplitString(T.Para2, ',') union all
                    select ID, Item, 'Para3' from dbo.SplitString(T.Para3, ',') union all
                    select ID, Item, 'Para4' from dbo.SplitString(T.Para4, ',') union all
                    select ID, Item, 'Para5' from dbo.SplitString(T.Para5, ',') union all
                    select ID, Item, 'Para6' from dbo.SplitString(T.Para6, ',')
                   ) as S(ID, Item, Para)
     ) as C
pivot (min(C.Item) for C.Para in (Para1, Para2, Para3, Para4, Para5, Para6)) as P
order by P.SaveName, P.ID

作为使用的替代方法,您可以使用分割数据


参见

我假设第3行的
Para6的类型是3,而不是13?完美。谢谢蓝脚。
;with cte as
(
  select SaveName,
    cast(left(Para1, charindex(',',Para1+',')-1) as varchar(50)) para1,
    stuff(Para1, 1, charindex(',',Para1+','), '') para1list,
    cast(left(Para2, charindex(',',Para2+',')-1) as varchar(50)) para2,
    stuff(Para2, 1, charindex(',',Para2+','), '') para2list,
    cast(left(Para3, charindex(',',Para3+',')-1) as varchar(50)) para3,
    stuff(Para3, 1, charindex(',',Para3+','), '') para3list,
    cast(left(Para4, charindex(',',Para4+',')-1) as varchar(50)) para4,
    stuff(Para4, 1, charindex(',',Para4+','), '') para4list,
    cast(left(Para5, charindex(',',Para5+',')-1) as varchar(50)) para5,
    stuff(Para5, 1, charindex(',',Para5+','), '') para5list,
    cast(left(Para6, charindex(',',Para6+',')-1) as varchar(50)) para6,
    stuff(Para6, 1, charindex(',',Para6+','), '') para6list
  from yourtable
  union all
  select SaveName,
    cast(left(para1list, charindex(',',para1list+',')-1) as varchar(50)) para1,
    stuff(para1list, 1, charindex(',',para1list+','), '') para1list,
    cast(left(Para2list, charindex(',',Para2list+',')-1) as varchar(50)) para2,
    stuff(Para2list, 1, charindex(',',Para2list+','), '') para2list,
    cast(left(Para3list, charindex(',',Para3list+',')-1) as varchar(50)) para3,
    stuff(Para3list, 1, charindex(',',Para3list+','), '') para3list,
    cast(left(Para4list, charindex(',',Para4list+',')-1) as varchar(50)) para4,
    stuff(Para4list, 1, charindex(',',Para4list+','), '') para4list,
    cast(left(Para5list, charindex(',',Para5list+',')-1) as varchar(50)) para5,
    stuff(Para5list, 1, charindex(',',Para5list+','), '') para5list,
    cast(left(Para6list, charindex(',',Para6list+',')-1) as varchar(50)) para6,
    stuff(Para6list, 1, charindex(',',Para6list+','), '') para6list
  from cte
  where para1list > ''
    or para2list > ''
    or para3list > ''
    or para4list > ''
    or para5list > ''
    or para6list > ''
) 
select SaveName, para1, para2, para3, para4, para5, para6
from cte
order by savename;