将一列拆分为其他列的 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 命令的主要内容,如果未能解决你的问题,请参考以下文章

R中根据特定字符将一列拆分为几列的方法

sql数据拆分

将一列的值用于另一列(SQL Server)?

如何将一列拆分为多列

使用 SSIS OR T-SQL 将一列带引号和不带引号的逗号分隔值拆分为多列

根据分隔符拆分列,然后在保留其他列的情况下取消透视结果