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'