将一列拆分为其他列的 SQL 命令
Posted
技术标签:
【中文标题】将一列拆分为其他列的 SQL 命令【英文标题】:SQL command to break up a column into additional columns 【发布时间】:2020-04-08 15:09:04 【问题描述】:我试图在我的表中取一列,该列具有多个值(最多 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 Col4 Col5 Col6 Col7 Col8 Col9 ....
1 Tom 12345678 87654321 11111111 22222222
2 Joe 14563467
3 Zac 12345678 87654321
感谢任何帮助!
【问题讨论】:
我建议***.com/questions/10581772/…已经回答了这个问题 【参考方案1】:您可以首先使用新的STRING_SPLIT
函数将数据规范化到派生表中,其中拆分列向下延伸。使用该表,您可以基于 Col1 进行 PIVOT 以创建 5 列,基本上将先前拆分的数据拉回。接下来,将该数据用作更新回源表的源。
如果您不在 SQL Server 2016 上,则需要将 STRING_SPLIT
替换为分隔字符串解析器 Table Value Function 。
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
【讨论】:
Ross,我的团队在 SQL Server 2014 上,对于这种情况,什么是好的分隔字符串解析器表值函数? 你会得到很多例子,但是,我会为 sql server 搜索最高效的字符串拆分例程。有一些相当不错的文章,有些人花了很多时间比较算法。【参考方案2】:如果您确定 Col3 中的最大值计数为 10,您可以在 Col3 上使用带有拆分字符串的交叉应用,并选择具有拆分值的列和由 col1 和 col2 分区的行号。第二步是按行旋转这个表
WITH SplitTable AS(
SELECT Col1
,Col2
,value
,ROW_NUMBER() OVER(PARTITION BY Col1, Col2 ORDER BY (SELECT NULL)) as rn
FROM YOUR_TABLE
CROSS APPLY STRING_SPLIT(Col3, '|') AS YT
)
SELECT Col1
,Col2
,[1]
,[2]
,[3]
,[4]
,[5]
,[6]
,[7]
,[8]
,[9]
,[10]
FROM SplitTable
PIVOT(
MAX(VALUE)
FOR RN IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])
) as PVT
【讨论】:
以上是关于将一列拆分为其他列的 SQL 命令的主要内容,如果未能解决你的问题,请参考以下文章