Как развернуть две колонки в SQL Сервер? - PullRequest
1 голос
/ 22 марта 2020

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

 UserName   UserId   
    -----      ----    
    Bob         445       
    Bob         450       
    Rachel      512       
    Rachel      520       
    Rachel      570       
    Simon       771       
    Simon       760 

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

Bob       Rachel       Simon
445          512        771
450          520        760
             570

Ответы [ 2 ]

4 голосов
/ 22 марта 2020

На всякий случай, если вы ищете динамический c пивот

Пример

Declare @SQL varchar(max) = '
Select *
From (
        Select * 
              ,RN = row_number() over (partition by username order by UserId) 
        from #YourTable
     ) A
 Pivot (max(UserID) For [UserName] in (' + stuff((Select distinct ',' + QuoteName([UserName]) From  #YourTable Order By 1 For XML Path('')),1,1,'')  + ') ) p
'

--Print @SQL
Exec(@SQL);

Возвраты

RN  Bob   Rachel    Simon
1   445   512       760
2   450   520       771
3   NULL  570       NULL
1 голос
/ 22 марта 2020

Это сложно. Вы можете использовать агрегацию, но вам нужно нумеровать строки:

select max(case when username = 'Bob' then uid end) as bob,
       max(case when username = 'Rachel' then uid end) as Rachel,
       max(case when username = 'Simon' then uid end) as Simon      
from (select t.*,
             row_number() over (partition by username order by uid) as seqnum
      from t
     ) t
group by seqnum
order by seqnum;

Примечание. Это упорядочивает значения по uid, что немного отличается от вашего набора результатов. SQL таблицы представляют неупорядоченные наборы. Порядок исходных строк отсутствует, если только в столбце не указано это упорядочение. Если у вас есть такой столбец, вы можете использовать его вместо order by uid для row_number().

...