Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Транспониране на колони в редове с помощта на UNPIVOT

Можете лесно да разделите YP низ с помощта на LEFT() , RIGHT() , SUBSTRING() и т.н. Моето предложение е как се справяте с вашия UNPIVOT . Изглежда, че имате много колони за UNPIVOT така че моето предложение може да е да се внедри динамичен SQL за изпълнение на тази заявка. Бихте го направили по следния начин:

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)

вижте SQL Fiddle с демонстрация



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразуването не бе успешно при преобразуване на дата и/или час от символен низ при вмъкване на дата и час

  2. Използване на броя на редовете от временна таблица в цикъл while SQL Server 2008

  3. GUID:varchar(36) срещу uniqueidentifier

  4. Динамичен SQL - EXEC(@SQL) срещу EXEC SP_EXECUTESQL(@SQL)

  5. Как да шифровате съхранена процедура в SQL Server