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.Dies ist eher eine Methode als nur ein einzelnes Skript, bietet Ihnen jedoch viel mehr Flexibilität.
Zunächst gibt es 3 Objekte:
ColumnActionList
] -> enthält Daten als Parameterproc_PivotPrepare
] -> bereitet unsere Daten vorproc_PivotExecute
] -> Skript ausführenCREATE TYPE [dbo]. [ColumnActionList] AS TABLE ([ID] [smallint] NICHT NULL, [Spaltenname] nvarchar NICHT NULL, [Aktion] nchar NICHT NULL); GEHEN
Wenn Sie die erste Abfrage ausführen (indem Sie die Quell-DB und den Tabellennamen übergeben), erhalten Sie eine vorab erstellte Ausführungsabfrage für den zweiten SP. Sie müssen lediglich die Spalte aus Ihrer Quelle definieren: + Stabil + Wert (wird verwendet um darauf basierende Werte zu konzentrieren) + Dim (Spalte, um die Sie schwenken möchten)
Namen und Datentypen werden automatisch definiert!
Ich kann es nicht für Produktionsumgebungen empfehlen, erledigt es aber für Ad-hoc-BI-Anfragen.
quelle
Could not find stored procedure 'dbo.sp_PivotIt'.
Irgendwelche Ratschläge?sp_Pivot_Execute
Wechseln zuproc_PivotExecute
.