使用SQL Server拆分和转置表数据

时间:2018-11-16 10:41:23

标签: sql sql-server tsql split pivot

我具有以下结构的数据

 ID   Sub_ID
 123  '1;2;3'

我想创建一个具有以下结构的表

ID Sub_ID
123 1
123 2
123 3

是否可以在Microsoft SQL Server上处理此任务?

THX 拉兹鲁(Lazloo)

2 个答案:

答案 0 :(得分:2)

如果您使用的是SQL Server 2016或更高版本,则STRING_SPLIT是此处的一种选择:

WITH cte AS (
    SELECT ID, value
    FROM yourTable
        CROSS APPLY STRING_SPLIT(Sub_ID, ';')
)

SELECT *
FROM cte
ORDER BY value;

enter image description here

Demo

如果您使用的是SQL Server的早期版本,请here is a link回答一个可以帮助您的规范SO问题。如果您长期有此需要,请考虑升级。

答案 1 :(得分:0)

如果您的SQL Server 2016版本较旧,则需要创建自己的拆分函数:

CREATE  FUNCTION [dbo].[Tbl_Fn_Split](
    @InputText VARCHAR(8000) 
  , @Delimiter VARCHAR(8000) = ' ' -- delimiter that separates items
) RETURNS @List TABLE (Result VARCHAR(8000))

BEGIN
DECLARE @aResult VARCHAR(8000)
WHILE CHARINDEX(@Delimiter,@InputText,0) <> 0
BEGIN
    SELECT
        @aResult=RTRIM(LTRIM(SUBSTRING(@InputText,1,CHARINDEX(@Delimiter,@InputText,0)-1))),
        @InputText=RTRIM(LTRIM(SUBSTRING(@InputText,CHARINDEX(@Delimiter,@InputText,0)+LEN(@Delimiter),LEN(@InputText))))

    IF LEN(@aResult) > 0
        INSERT INTO @List SELECT @aResult
    END

    IF LEN(@InputText) > 0
        INSERT INTO @List SELECT @InputText 

    RETURN

END

然后您可以使用CROSS APPLY将其与查询一起使用:

SELECT * FROM tTable  T
CROSS APPLY (SELECT * FROM [dbo].[Tbl_Fn_Split](T.Sub_Id,';')) S