Es gibt mehrere Möglichkeiten, wie Sie Daten aus mehreren Zeilen in Spalten transformieren können.
Verwendung von PIVOT
In SQL Server können Sie die PIVOT
-Funktion verwenden, um die Daten von Zeilen in Spalten zu transformieren:
select Vorname, Betrag, Postleitzahl, Nachname, Kontonummer
from
(
select Wert, Spaltenname
from yourtable
) d
pivot
(
max(Wert)
for Spaltenname in (Vorname, Betrag, Postleitzahl, Nachname, Kontonummer)
) piv;
Siehe Demo.
Pivot mit unbekannter Anzahl von Spaltennamen
Wenn Sie eine unbekannte Anzahl von Spaltennamen
haben, 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(Spaltenname)
from yourtable
group by Spaltenname, id
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
select Wert, Spaltenname
from yourtable
) x
pivot
(
max(Wert)
for Spaltenname in (' + @cols + N')
) p '
exec sp_executesql @query;
Siehe Demo.
Verwendung 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 Spaltenname = 'Vorname' then Wert end) Vorname,
max(case when Spaltenname = 'Betrag' then Wert end) Betrag,
max(case when Spaltenname = 'Postleitzahl' then Wert end) Postleitzahl,
max(case when Spaltenname = 'Nachname' then Wert end) Nachname,
max(case when Spaltenname = 'Kontonummer' then Wert end) Kontonummer
from yourtable
Siehe Demo.
Verwendung mehrerer Joins
Dies könnte auch mit mehreren Joins abgeschlossen werden, aber Sie benötigen eine Spalte, um jede der Zeilen zu verknüpfen, die Sie nicht in Ihren Beispieldaten haben. Aber die grundlegende Syntax wäre:
select vn.Wert as Vorname,
a.Wert as Betrag,
plz.Wert as Postleitzahl,
ln.Wert as Nachname,
knr.Wert as Kontonummer
from yourtable vn
left join yourtable a
on vn.somecol = a.somecol
and a.Spaltenname = 'Betrag'
left join yourtable plz
on vn.somecol = plz.somecol
and plz.Spaltenname = 'Postleitzahl'
left join yourtable ln
on vn.somecol = ln.somecol
and ln.Spaltenname = 'Nachname'
left join yourtable knr
on vn.somecol = knr.somecol
and knr.Spaltenname = 'Kontonummer'
where vn.Spaltenname = 'Vorname'