Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 da riga a colonna

Esistono alcuni modi per trasformare i dati da righe in colonne.

Poiché stai utilizzando SQL Server 2008, puoi utilizzare la funzione PIVOT.

Suggerirei di usare row_number() funzione per facilitare la rotazione dei dati. Se hai un numero noto di valori, puoi codificare la query:

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;

Vedi SQL Fiddle con demo .

Per la tua situazione hai dichiarato che avrai un numero sconosciuto di valori che devono essere colonne. In tal caso, vorrai utilizzare l'SQL dinamico per generare la stringa di query da eseguire:

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)

Vedi SQL Fiddle con demo . Entrambi danno un risultato:

|  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 |