用于将列拆分为其他列的SQL命令
我试图在我的表中选取一列,该列有多个值,最多10个值由其中的管道|分隔,并将分隔的值添加到表中的其他列中。注释在SQL SVR 2014上运行 表用于将列拆分为其他列的SQL命令,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我试图在我的表中选取一列,该列有多个值,最多10个值由其中的管道|分隔,并将分隔的值添加到表中的其他列中。注释在SQL SVR 2014上运行 表 Col1 Col2 Col3 1 Tom 12345678|87654321|11111111|22222222|..... up to 10 2 Joe 14563467 3 Zac 12345678|87654321 我需要SQL的结果来生成 Col1 Col2 Col3
Col1 Col2 Col3
1 Tom 12345678|87654321|11111111|22222222|..... up to 10
2 Joe 14563467
3 Zac 12345678|87654321
我需要SQL的结果来生成
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 ....
1 Tom 12345678 87654321 11111111 22222222
2 Joe 14563467
3 Zac 12345678 87654321
感谢您的帮助 首先可以使用新的STRING_SPLIT函数将数据规范化为一个派生表,拆分列向下拉伸。使用该表,您可以基于Col1进行数据透视,创建5列,基本上是将先前拆分的数据向上拉。接下来,将该数据用作源,以便更新回源表 如果您不在SQL Server 2016上,则需要使用带分隔符的字符串解析器表值函数替换字符串_SPLIT
DECLARE @T TABLE(Col1 INT, Col2 NVARCHAR(50), Col3 NVARCHAR(50), Col4 NVARCHAR(50), Col5 NVARCHAR(50))
INSERT @T (COl1,Col2) VALUES (1,'12345678|87654321|11111111|22222222|')
INSERT @T (COl1,Col2) VALUES (2,'12345678')
INSERT @T (COl1,Col2) VALUES (3,'12345678|87654321|')
SELECT * FROM @T
;
WITH SplitData AS
(
SELECT
Col1,Col2 = S.Value,
RN = ROW_NUMBER()OVER( PARTITION BY Col1 ORDER BY (SELECT 1 AS X))
FROM
@T
CROSS APPLY STRING_SPLIT(Col2,'|') S
)
,UpdateData AS
(
SELECT
Col1, Col2=[1], Col3=[2], Col4=[3], Col5=[4]
FROM
(
SELECT Col1, Col2, RN FROM SplitData
) AS S
PIVOT(
MAX(Col2) FOR RN IN ([1], [2], [3], [4], [5])
) AS P
)
UPDATE L
SET L.Col1 = R.Col1, L.Col2=R.Col2, L.Col3=R.Col3, L.Col4=R.Col4, L.Col5 = R.Col5
FROM
@T L
INNER JOIN UpdateData R ON L.Col1 = R.Col1
SELECT * FROM @T
如果您确定Col3中的最大值计数为10,则可以在Col3上使用带拆分字符串的交叉应用,并选择具有拆分值的列以及由col1和col2划分的行号。第二步是按行透视此表 可拆分为 选择Col1 ,Col2 价值 ,按Col1超额分配的行数,按Col2排序,选择NULL作为rn 从你的桌子上 交叉应用字符串_SPLITCol3,“|”作为YT 选择Col1 ,Col2 ,[1] ,[2] ,[3] ,[4] ,[5] ,[6] ,[7] ,[8] ,[9] ,[10] 从可拆分 支点 最大值 对于[1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]、[9]、[10]中的RN 作为PVT
我建议Ross已经回答了这个问题,我的团队在SQL server 2014上,对于这种情况,什么是好的分隔字符串解析器表值函数?您将得到许多示例,但是,我将搜索SQL server最有效的字符串拆分例程。有一些相当不错的文章,其中一些人花了很多时间比较算法。