Так как вы используете SQL Server 16 или выше, вы можете использовать STRING_SPLIT
(убедитесь, что ваш уровень совместимости не менее 130, чтобы использовать его).
Я был невозможно заставить следующий код работать с любыми ссылками на скрипты, но вы можете скопировать / вставить его в https://sqliteonline.com/ (установите его на MS SQL, подключитесь, скопируйте / вставьте код и запустите):
![enter image description here](https://i.stack.imgur.com/MGNoz.png)
Код
Вот самая простая форма, которую я смог придумать:
WITH x AS (
SELECT
value v,
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) n
from STRING_SPLIT('2020_Campaign_SG_Test Email','_')
)
SELECT
[2] [Type],
[3] Segment,
[4] [Name]
FROM x
PIVOT(
MAX(v) FOR n IN([2],[3],[4])
) y
Вывод
Это сгенерирует следующее (первая строка - заголовок таблицы):
# Type Segment Name
Campaign SG Test Email
Пояснение
STRING_SPLIT
раздел
WITH x AS (
SELECT
value v,
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) n
from STRING_SPLIT('2020_Campaign_SG_Test Email','_')
)
В первой части я создаю временный именованный набор результатов x
(он же CTE или обычное табличное выражение ). В наборе результатов используется функция STRING_SPLIT
для разделения строки 2020_Campaign_SG_Test Email
на символ подчеркивания _
. Я также нумерую вывод набора результатов, используя ROW_NUMBER()
.
Это генерирует следующее (первая строка - заголовок таблицы):
# v n
2020 1
Campaign 2
SG 3
Test Email 4
PIVOT
section
SELECT
[2] [Type],
[3] Segment,
[4] [Name]
FROM x
PIVOT(
MAX(v) FOR n IN([2],[3],[4])
) y
Затем вторая часть берет наш результирующий набор x
и переносит строки данных в столбцы относительно агрегирования с помощью оператора PIVOT
. Агрегатная функция здесь MAX(v) FOR n IN([2],[3],[4])
. Использование функции MAX
удаляет все значения NULL
(в противном случае она будет перемещать и каждое v
в свой собственный столбец и добавлять NULL
значений для других столбцов) и дает нам только второй, третий и четвертый элементы в качестве вывода (поскольку вы указали только эти 3 элемента в качестве вывода в исходном вопросе).