SQL команда разбить столбец на дополнительные столбцы - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь взять один столбец в моей таблице, который имеет несколько значений (до 10), разделенных "pipe" "|" и добавьте значения с разделителями в дополнительные столбцы таблицы. Примечание (работает на 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

Любой помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Если вы уверены, что максимальное количество значений в 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
0 голосов
/ 08 апреля 2020

Вы можете сначала нормализовать ваши данные, используя новую функцию STRING_SPLIT, в производную таблицу с разделенными столбцами, вытянутыми вниз. Используя эту таблицу, вы можете PIVOT на основе Col1 создать 5 столбцов, которые в основном возвращают данные, которые были ранее разделены. Затем используйте эти данные в качестве источника для обновления обратно к исходной таблице.

Если вы не используете SQL Server 2016, вам нужно заменить STRING_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...