Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie Zeilen effizient in Spalten in SQL Server

Es gibt mehrere Möglichkeiten, Daten aus mehreren Zeilen in Spalten umzuwandeln.

Mit PIVOT

In SQL Server können Sie den PIVOT verwenden Funktion, um die Daten von Zeilen in Spalten umzuwandeln:

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;

Siehe Demo.

Pivot mit unbekannter Anzahl von columnnames

Wenn Sie eine unbekannte Anzahl von columnnames haben die Sie transponieren möchten, dann können Sie dynamisches SQL verwenden:

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;

Siehe Demo.

Eine Aggregatfunktion verwenden

Wenn Sie den PIVOT nicht verwenden möchten Funktion, dann können Sie eine Aggregatfunktion mit einem CASE verwenden Ausdruck:

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

Siehe Demo.

Mehrere Verknüpfungen verwenden

Dies könnte auch mit mehreren Joins durchgeführt werden, aber Sie benötigen eine Spalte, um jede der Zeilen zuzuordnen, die Sie nicht in Ihren Beispieldaten haben. Aber die grundlegende Syntax wäre:

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'