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

Dynamiczna tabela przestawna w SQL Server

Można to zrobić na serwerze sql, używając zarówno UNPIVOT a następnie PIVOT . Wersja statyczna to miejsce, w którym znasz kolumny do przekształcenia:

select *
from 
(
  select CaseId, EcoYear, val, item
  from yourtable
  unpivot
  (
    val
    for Item in (NetInv, NetOil, NetGas)
  )u
) x
pivot
(
  max(val)
  for ecoyear in ([2006], [2007], [2008], [2009], [2010], [2011],
                 [2012], [2013], [2014], [2015], [2016], [2017],
                 [2018], [2019], [2020])
) p

zobacz SQL Fiddle z demonstracją

Wersja dynamiczna określi rekordy wykonania:

DECLARE @colsPivot AS NVARCHAR(MAX),
    @colsUnpivot as NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(EcoYear) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourtable') and
               C.name LIKE 'Net%'
         for xml path('')), 1, 1, '')


set @query 
  = 'select *
      from
      (
        select caseid, ecoyear, val, col
        from yourtable
        unpivot
        (
          val
          for col in ('+ @colsunpivot +')
        ) u
      ) x1
      pivot
      (
        max(val)
        for ecoyear in ('+ @colspivot +')
      ) p'

exec(@query)

zobacz SQL Fiddle z demonstracją




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy tabela serwera sql może mieć dwie kolumny tożsamości?

  2. Unikaj tych 4 typowych błędów DBA

  3. TSQL:Jak przekonwertować czas lokalny na UTC? (Serwer SQL 2008)

  4. Jak włączyć usługę MSDTC w programie SQL Server?

  5. Pokaż zaawansowane opcje konfiguracji serwera w SQL Server (T-SQL)