sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2008 od řádků ke sloupci

Existuje několik způsobů, jak můžete transformovat data z řádků do sloupců.

Protože používáte SQL Server 2008, můžete použít funkci PIVOT.

Doporučil bych použít row_number() funkce, která pomáhá při otáčení dat. Pokud máte známý počet hodnot, můžete dotaz napevno zakódovat:

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;

Viz SQL Fiddle s ukázkou .

Pro vaši situaci jste uvedli, že budete mít neznámý počet hodnot, které musí být sloupce. V takovém případě budete chtít použít dynamické SQL ke generování řetězce dotazu, který se má provést:

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)

Viz SQL Fiddle s ukázkou . Obě dávají výsledek:

|  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. Po zavření a opětovném otevření pokračujte ve vyplňování formuláře HTML

  2. Zdá se, že nastavení schématu v PostgreSQL JDBC nefunguje

  3. Aktualizujte/zvyšte jeden sloupec na více řádcích najednou

  4. mysql vkládání do 2 tabulek najednou, které mají primární klíč a cizí klíč