Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Sql Server 2008 od wiersza do kolumny

Istnieje kilka sposobów przekształcania danych z wierszy w kolumny.

Ponieważ używasz SQL Server 2008, możesz użyć funkcji PIVOT.

Sugerowałbym użycie row_number() funkcja wspomagająca obracanie danych. Jeśli masz znaną liczbę wartości, możesz na stałe zakodować zapytanie:

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;

Zobacz SQL Fiddle z wersją demonstracyjną .

W swojej sytuacji stwierdziłeś, że będziesz mieć nieznaną liczbę wartości, które muszą być kolumnami. W takim przypadku będziesz chciał użyć dynamicznego SQL do wygenerowania ciągu zapytania do wykonania:

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)

Zobacz SQL Fiddle z wersją demonstracyjną . Oba dają wynik:

|  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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Monitorowanie liczników wydajności za pomocą PERFMON | Rozwiązywanie problemów z wydajnością programu SQL Server -3

  2. Dodaj domyślną wartość pola datetime w SQL Server do znacznika czasu

  3. Co to jest limit czasu połączenia w ciągu połączenia serwera sql?

  4. Przechowywana procedura i uprawnienia — czy WYKONANIE wystarczy?

  5. Zrozumienie różnic między CUBE a ROLLUP