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

Efektywnie konwertuj wiersze na kolumny w serwerze sql

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

Korzystanie z PIVOT

W SQL Server możesz użyć PIVOT funkcja przekształcania danych z wierszy na kolumny:

select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
  select value, columnname
  from yourtable
) d
pivot
(
  max(value)
  for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;

Zobacz Demo.

Pivot z nieznaną liczbą columnnames

Jeśli masz nieznaną liczbę columnnames które chcesz transponować, możesz użyć dynamicznego SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName) 
                    from yourtable
                    group by ColumnName, id
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                select value, ColumnName
                from yourtable
            ) x
            pivot 
            (
                max(value)
                for ColumnName in (' + @cols + N')
            ) p '

exec sp_executesql @query;

Zobacz Demo.

Korzystanie z funkcji agregującej

Jeśli nie chcesz używać PIVOT funkcji, możesz użyć funkcji agregującej z CASE wyrażenie:

select
  max(case when columnname = 'FirstName' then value end) Firstname,
  max(case when columnname = 'Amount' then value end) Amount,
  max(case when columnname = 'PostalCode' then value end) PostalCode,
  max(case when columnname = 'LastName' then value end) LastName,
  max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable

Zobacz Demo.

Korzystanie z wielu połączeń

Można to również wykonać za pomocą wielu sprzężeń, ale będziesz potrzebować jakiejś kolumny, aby powiązać każdy z wierszy, których nie masz w przykładowych danych. Ale podstawowa składnia to:

select fn.value as FirstName,
  a.value as Amount,
  pc.value as PostalCode,
  ln.value as LastName,
  an.value as AccountNumber
from yourtable fn
left join yourtable a
  on fn.somecol = a.somecol
  and a.columnname = 'Amount'
left join yourtable pc
  on fn.somecol = pc.somecol
  and pc.columnname = 'PostalCode'
left join yourtable ln
  on fn.somecol = ln.somecol
  and ln.columnname = 'LastName'
left join yourtable an
  on fn.somecol = an.somecol
  and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest prawidłowa nazwa tabeli asocjacji (relacja wiele-do-wielu)

  2. Zalecane procesory Intel dla obciążeń SQL Server 2014

  3. Preferowana metoda przechowywania haseł w bazie danych

  4. instrukcja sql use ze zmienną

  5. Polecenie SQL INSERT działa, ale dane nie pojawiają się w tabeli