sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008 rad till kolumn

Det finns några sätt att omvandla data från rader till kolumner.

Eftersom du använder SQL Server 2008 kan du använda PIVOT-funktionen.

Jag skulle föreslå att du använder row_number() funktion för att hjälpa till att svänga data. Om du har ett känt antal värden kan du hårdkoda frågan:

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;

Se SQL-fiol med demo .

För din situation angav du att du kommer att ha ett okänt antal värden som måste vara kolumner. I så fall vill du använda dynamisk SQL för att generera frågesträngen som ska köras:

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)

Se SQL-fiol med demo . Båda ger ett resultat:

|  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. Uppdatera värden i Mysql tidsstämpel till ett datetime-värde.

  2. MYSQL senaste inloggning och antal inloggningar under de senaste 3 månaderna

  3. kommaseparerad sträng av valda värden i mysql

  4. anropa Oracles lagrade procedurer i R - hur får man resultatet?