Как перевести значения из строк в столбец на основе значения из соответствующего столбца - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь развернуть набор данных на основе значения 3, чтобы каждая строка представляла все URL-адреса профиля, связанные с каждым идентификатором, а каждый столбец - с кодом профиля

Этот вопрос очень похож на то, что я пытаюсь достичь, однако он не группирует столбцы, которые поворачиваются на основе другого значения: Сводные значения для столбцов на основе сгруппированных столбцов в SQL

Итак, приведена следующая таблица примеров:

Id        ProfileCode  ProfileURL  
-------------------------------------------------------
7ADC7368  IA           http://www.domainIA.com/profile1
5C627D6F  IA           http://www.domainIA.com/profile2
5C627D6F  AG           http://www.domainAG.com/profile1
5C627D6F  AF           http://www.domainAF.com/profile1
664B4AE9  IA           http://www.domainIA.com/profile3
664B4AE9  AF           http://www.domainAF.com/profile2

Я надеюсь преобразовать его в следующую таблицу:

Id        IA                                AG                                AF
-------------------------------------------------------------------------------------------------------------
7ADC7368  http://www.domainIA.com/profile1  null                              null
5C627D6F  http://www.domainIA.com/profile2  http://www.domainAG.com/profile1  http://www.domainAF.com/profile1
664B4AE9  http://www.domainIA.com/profile3  null                              http://www.domainAF.com/profile2

Это код, который я пытался проработать, но я не могу найти способ связать стержень с ассоциацией между URL-адресом профиля и связанным с ним кодом профиля.

declare @tmp TABLE (Id NVARCHAR(15), ProfileCode NVARCHAR(2), ProfileURL NVARCHAR(50))

insert into @tmp (Id, ProfileCode, ProfileURL)
values  ('7ADC7368', 'IA', 'http://www.domainIA.com/profile1'),
        ('5C627D6F', 'IA', 'http://www.domainIA.com/profile2'),
        ('5C627D6F', 'AG', 'http://www.domainAG.com/profile1'),
        ('5C627D6F', 'AF', 'http://www.domainAF.com/profile1'),
        ('664B4AE9', 'IA', 'http://www.domainIA.com/profile3'),
        ('664B4AE9', 'AF', 'http://www.domainAF.com/profile2')

select 
     pvt.id,
    CASE
        WHEN ProfileCode = 'IA' THEN ProfileURL 
    END AS 'IA',
    CASE
        WHEN ProfileCode = 'AF' THEN ProfileURL 
    END AS 'AF',
    CASE
        WHEN ProfileCode = 'AG' THEN ProfileURL
    END AS 'AG'
from (  
    select 
         Id, ProfileCode, ProfileURL
        ,ROW_NUMBER() over(partition by ProfileCode order by ProfileURL) as RowNum
from 
    @tmp
) a
pivot (MAX(ProfileCode) for RowNum in ('IA', 'AF', 'AG') as pvt

Я был бы очень признателен за любую помощь или указатели на то, чего я пытаюсь достичь.

1 Ответ

1 голос
/ 06 мая 2019

Просто используйте условное агрегирование:

SELECT id,
       MAX(CASE WHEN ProfileCode = 'IA' THEN ProfileURL END) AS IA,
       MAX(CASE WHEN ProfileCode = 'AF' THEN ProfileURL END) AS AF,
       MAX(CASE WHEN ProfileCode = 'AG' THEN ProfileURL END) AS AG
FROM @tmp t
GROUP BY id;

Вам нужно ROW_NUMBER(), только если у вас есть несколько одинаковых кодов для данного идентификатора и , если вы хотите получить результаты в отдельных строках.Ваши примеры данных и текущая логика показывают, что это не так.

...