Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Sql Server 2008 linha para coluna


Existem algumas maneiras de transformar os dados de linhas em colunas.

Como você está usando o SQL Server 2008, pode usar a função PIVOT.

Eu sugeriria usar o row_number() função para ajudar a pivotar os dados. Se você tiver um número conhecido de valores, poderá codificar a consulta:
select user, category1, category2, category3, category4
from
(
  select [user], category,
    'Category'+cast(row_number() over(partition by [user] 
                                      order by [user]) as varchar(3)) rn
  from yt
) d
pivot
(
  max(category)
  for rn in (category1, category2, category3, category4)
) piv;

Consulte SQL Fiddle with Demo .

Para sua situação, você afirmou que terá um número desconhecido de valores que precisam ser colunas. Nesse caso, você desejará usar SQL dinâmico para gerar a string de consulta a ser executada:
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Category'+cast(row_number() over(partition by [user] 
                                                                      order by [user]) as varchar(3))) 
                    from yt
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [user],' + @cols + ' 
              from
              (
                select [user], category,
                  ''Category''+cast(row_number() over(partition by [user] 
                                                    order by [user]) as varchar(3)) rn
                from yt
              ) d
              pivot 
              (
                  max(category)
                  for rn in (' + @cols + ')
              ) p '

execute(@query)

Consulte SQL Fiddle with Demo . Ambos dão um resultado:
|  USER |  CATEGORY1 | CATEGORY2 | CATEGORY3 | CATEGORY4 |
----------------------------------------------------------
| Bruce |     Laptop |      Beer |    (null) |    (null) |
| Chuck | Cell Phone |    (null) |    (null) |    (null) |
|  Jack |      Shoes |       Tie |     Glass |    (null) |
| Peggy |       Shoe |     Skirt |       Bat |       Cat |