sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 rij naar kolom

Er zijn een paar manieren waarop u de gegevens van rijen in kolommen kunt omzetten.

Aangezien u SQL Server 2008 gebruikt, kunt u de PIVOT-functie gebruiken.

Ik raad aan om de row_number() . te gebruiken functie om te helpen bij het draaien van de gegevens. Als u een bekend aantal waarden heeft, kunt u de query hardcoderen:

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;

Zie SQL Fiddle met demo .

Voor uw situatie heeft u aangegeven dat u een onbekend aantal waarden zult hebben die kolommen moeten zijn. In dat geval wilt u dynamische SQL gebruiken om de queryreeks te genereren die moet worden uitgevoerd:

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)

Zie SQL Fiddle met demo . Beide geven een resultaat:

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


  1. SQL-query met union en join

  2. Zet 24-uurs tijd om in 12-uurs plus AM/PM-indicatie Oracle SQL

  3. hoe het maximale geheugengebruik van SQL Server te configureren

  4. multiprocessing-module en verschillende psycopg2-verbindingen