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

Transpozycja kolumn do wierszy za pomocą UNPIVOT

Możesz łatwo podzielić YP ciąg znaków za pomocą LEFT() , RIGHT() , SUBSTRING() , itp. Moja sugestia dotyczyłaby sposobu obsługi UNPIVOT . Wygląda na to, że masz dużo kolumn do UNPIVOT więc moja sugestia może polegać na zaimplementowaniu dynamicznego SQL do wykonania tego zapytania. Zrobiłbyś to w ten sposób:

declare @colsUnpivot varchar(max),
  @query  AS NVARCHAR(MAX),
  @cols  varchar(max)

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

select @cols = stuff((select ','
                      +quotename(C.name) + ' as ' + replace(C.name, 'Qty', '')
         from sys.columns as C
         where C.object_id = object_id('yourtable') and
               C.name like 'Qty%'
         for xml path('')), 1, 1, '')

set @query 
  = 'select rowid, 
          left(YP, 1) YP,
          cast(right(YP, len(YP) - 1) as int) period,
          Val
     from
     (
        select rowid, ' + @cols + '
        from yourtable
     ) x1
     unpivot
     (
        val for YP IN (' + @colsUnpivot + ')
     ) u'

exec(@query)

zobacz SQL Fiddle z wersją demonstracyjną



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak agregować wartości z obrotu?

  2. Dlaczego klauzula „Top” może prowadzić do długotrwałych kosztów

  3. Porównaj wartość wielu kolumn z dwóch różnych baz danych

  4. Czy pojedyncza instrukcja SQL Server jest niepodzielna i spójna?

  5. Jak uzyskać losowe wiersze z tabeli SQL Server — samouczek SQL Server / TSQL część 117