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

SQL Server 2008 Række til kolonne

Der er et par måder, hvorpå du kan transformere data fra rækker til kolonner.

Da du bruger SQL Server 2008, kan du bruge PIVOT-funktionen.

Jeg vil foreslå at bruge row_number() funktion til at hjælpe med at pivotere dataene. Hvis du har et kendt antal værdier, kan du hårdkode forespørgslen:

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 Fiddle with Demo .

For din situation har du angivet, at du vil have et ukendt antal værdier, der skal være kolonner. I så fald vil du bruge dynamisk SQL til at generere forespørgselsstrengen, der skal udføres:

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 Fiddle with Demo . Begge giver et 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. Få det korte måneds navn i PostgreSQL

  2. Delt hit-cache i postgreSQL

  3. Hvordan sender man en post som parameter for PL/pgSQL-funktion?

  4. API-serveren returnerer en 404-fejl