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

Dynamiczny przestaw (wiersz do kolumn)

Twoje dane wyjściowe nie są dokładnie jasne, ale możesz użyć obu UNPIVOT i PIVOT funkcja, aby uzyskać wynik

Jeśli znasz liczbę kolumn, możesz na stałe zakodować wartości:

select *
from
(
  select id, 
    'Instance'+cast(instance as varchar(10))+'_'+col col, 
    value
  from 
  (
    select id, 
      Instance, 
      Name, 
      cast(Size as varchar(50)) Size,
      Tech
    from yourtable
  ) x
  unpivot
  (
    value
    for col in (Name, Size, Tech)
  ) u
) x1
pivot
(
  max(value) 
  for col in
    ([Instance0_Name], [Instance0_Size], [Instance0_Tech], 
     [Instance1_Name], [Instance1_Size], [Instance1_Tech], 
     [Instance2_Name], [Instance2_Size], [Instance2_Tech], 
     [Instance3_Name], [Instance3_Size], [Instance3_Tech])
) p

Zobacz SQL Fiddle z wersją demonstracyjną

Następnie, jeśli masz nieznaną liczbę wartości, możesz użyć dynamicznego sql:

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

select @colsPivot = STUFF((SELECT ',' 
                      + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name)
                    from yourtable t
                    cross apply sys.columns as C
                    where C.object_id = object_id('yourtable') and
                         C.name not in ('id', 'instance')
                    group by t.instance, c.name
                    order by t.instance
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select *
      from
      (
        select id, 
          ''Instance''+cast(instance as varchar(10))+''_''+col col, 
          value
        from 
        (
          select id, 
            Instance, 
            Name, 
            cast(Size as varchar(50)) Size,
            Tech
          from yourtable
        ) x
        unpivot
        (
          value
          for col in (Name, Size, Tech)
        ) u 
      ) x1
      pivot
      (
        max(value)
        for col in ('+ @colspivot +')
      ) p'

exec(@query)

Zobacz SQL Fiddle z wersją demonstracyjną

Jeśli wynik nie jest poprawny, edytuj swój OP i opublikuj wynik, którego oczekujesz od obu podanych identyfikatorów.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nazwa lub numer kolumny ... nie pasuje do definicji tabeli w tabeli utworzonej przez skrypt tworzenia.Błąd wyświetlany podczas wstawiania wierszy z jednej tabeli do drugiej

  2. Usuń końcowe zera z dziesiętnych w SQL Server

  3. Jak mogę edytować wartości INSERT w wyzwalaczu na SQL Server?

  4. SQL Server 2008 dzieli, sortuje i łączy wartości

  5. Instalowanie Ubuntu 18.04 dla SQL Server 2019 na maszynie wirtualnej przy użyciu VMware Workstation