Sql server 使用Split函数重构SQL表
我目前正在尝试学习拆分函数以及如何实际使用拆分函数。我有一张需要拆分的桌子,我认为我需要使用拆分(因此尝试学习)。然而,我对如何让它工作感到困惑 使用excel作为第一组数据的模型是它的样子。第二盘是我想要的结果。 有人能帮忙吗?对每一列使用a,然后使用a组合结果,以正确的方式检索值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
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;