Es gibt verschiedene Möglichkeiten, Daten aus mehreren Zeilen in Spalten umzuwandeln.
Verwenden von PIVOT
In SQL Server können Sie die PIVOT
Funktion verwenden, 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 Personen haben columnnames
, die Sie transponieren möchten, 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 .
Verwenden einer Aggregatfunktion
Wenn Sie die PIVOT
Funktion nicht verwenden möchten, können Sie eine Aggregatfunktion mit einem CASE
Ausdruck verwenden:
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 kann auch mit mehreren Verknüpfungen abgeschlossen werden. Sie benötigen jedoch eine Spalte, um die einzelnen Zeilen zuzuordnen, die in Ihren Beispieldaten nicht enthalten sind. Die grundlegende Syntax wäre jedoch:
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'
cross join
anstattleft join
dass jede Unterabfrage eine Zeile zurückgibt.