SQL Pivot для строкового значения вместо числового

У меня есть существующая таблица со следующими данными:

InputName   ResolvedName    Type    InsertDate
Server_1    Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_2    Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_3    Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_4    Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_5    Cluster_Alias_1 ABC 9/18/2018 1:55:12 PM
Server_6    Cluster_Alias_1 ABC 9/18/2018 1:55:12 PM
Server_7    Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_8    Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_9    Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_10   Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM

И я пытаюсь использовать SQL Pivot, чтобы он выглядел так:

ResolvedName    InputName1  InputName2  InputName3  InputName4  InputName5  InputName6  InputName7  InputName8  InputName9  InputName10
Cluster_Alias_1 Server_1    Server_2    Server_3    Server_4    Server_5    Server_6    Server_7    Server_8    Server_9    Server_10

Я просмотрел несколько решений, и все связано с поворотом числа, но все относится к числу, а не к строке.

Ссылки, которые я пробовал:

https://www.sqlshack.com/multiple-options-to-transpose-rows-into-columns/

Преобразование строк в столбцы с помощью «Pivot» в SQL Server

https://data.stackexchange.com/stackoverflow/query/497432

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
64
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Не совсем уверен, но я думаю, вы ищете что-то вроде ниже-

SELECT ResolvedName,
MAX(CASE WHEN InputName = 'Server_1' THEN InputName ELSE NULL END)  InputName1, 
MAX(CASE WHEN InputName = 'Server_2' THEN InputName ELSE NULL END)  InputName2, 
MAX(CASE WHEN InputName = 'Server_3' THEN InputName ELSE NULL END)  InputName3, 
MAX(CASE WHEN InputName = 'Server_4' THEN InputName ELSE NULL END)  InputName4, 
MAX(CASE WHEN InputName = 'Server_5' THEN InputName ELSE NULL END)  InputName5, 
MAX(CASE WHEN InputName = 'Server_6' THEN InputName ELSE NULL END)  InputName6, 
MAX(CASE WHEN InputName = 'Server_7' THEN InputName ELSE NULL END)  InputName7, 
MAX(CASE WHEN InputName = 'Server_8' THEN InputName ELSE NULL END)  InputName8, 
MAX(CASE WHEN InputName = 'Server_9' THEN InputName ELSE NULL END)  InputName9, 
MAX(CASE WHEN InputName = 'Server_10' THEN InputName ELSE NULL END)  InputName10
FROM your_table
GROUP BY ResolvedName
Ответ принят как подходящий

Если вам не нужно делать это динамически на основе количества входов, вам нужно просто создать имена столбцов, используя row_number, и повернуть на основе комбинированного имени «InputName» + row_number

Что-то типа:

select * 
from (
    select ResolvedName, 
           InputName, 
           concat('InputName',row_number() over (partition by ResolvedName order by InputName)) ColumnNames
    from [table]
) t 
pivot (
    max(InputName)
    for ColumnNames in ([InputName1],[InputName2],[InputName3],[InputName4],[InputName5],[InputName6],[InputName7],[InputName8])
) p

вы также можете использовать dynamic sql, чтобы сделать его более гибким. Прямо сейчас он привязан к 10 серверу.

DarkRob 23.07.2019 20:14

Вы можете попробовать это для динамического запроса.

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)

    select @cols = STUFF((SELECT ',' + concat('InputName',row_number() over (partition by ResolvedName order by InputName)) 
                        from [table]
                        group by ResolvedName    
                        order by ResolvedName    
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')


    set @query = 'select * 
    from (
        select ResolvedName, 
               InputName, 
               concat(''InputName'',row_number() over (partition by ResolvedName order by InputName)) ColumnNames
        from [table]
    ) t 
    pivot (
        max(InputName)
        for ColumnNames in (' + @cols + ')
    ) p'

    execute(@query);

Другие вопросы по теме