Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2008 ligne à colonne

Il existe plusieurs façons de transformer les données des lignes en colonnes.

Puisque vous utilisez SQL Server 2008, vous pouvez utiliser la fonction PIVOT.

Je suggérerais d'utiliser le row_number() fonction pour aider à faire pivoter les données. Si vous avez un nombre connu de valeurs, vous pouvez coder en dur la requête :

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;

Voir SQL Fiddle avec démo .

Pour votre situation, vous avez déclaré que vous aurez un nombre inconnu de valeurs qui doivent être des colonnes. Dans ce cas, vous souhaiterez utiliser le SQL dynamique pour générer la chaîne de requête à exécuter :

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)

Voir SQL Fiddle avec démo . Les deux donnent un résultat :

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