Suchen Sie nach einer eleganten (oder einer beliebigen) Lösung zum Konvertieren von Spalten in Zeilen.
Hier ein Beispiel: Ich habe eine Tabelle mit dem folgenden Schema:
[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]
Folgendes möchte ich als Ergebnis erhalten:
[ID] [EntityId] [IndicatorName] [IndicatorValue]
Und die Ergebniswerte sind:
1 1 'Indicator1' 'Value of Indicator 1 for entity 1'
2 1 'Indicator2' 'Value of Indicator 2 for entity 1'
3 1 'Indicator3' 'Value of Indicator 3 for entity 1'
4 2 'Indicator1' 'Value of Indicator 1 for entity 2'
Und so weiter..
Macht das Sinn? Haben Sie Vorschläge, wo Sie suchen und wie Sie dies in T-SQL tun können?
sql
sql-server
tsql
unpivot
Sergei
quelle
quelle
Antworten:
Mit der UNPIVOT- Funktion können Sie die Spalten in Zeilen konvertieren:
Beachten Sie, dass die Datentypen der Spalten, die Sie entfernen, identisch sein müssen, sodass Sie möglicherweise die Datentypen konvertieren müssen, bevor Sie das Unpivot anwenden.
Sie können auch
CROSS APPLY
mit UNION ALL die Spalten konvertieren:Abhängig von Ihrer Version von SQL Server können Sie CROSS APPLY sogar mit der VALUES-Klausel verwenden:
Wenn Sie 150 Spalten zum Aufheben des Pivots haben und nicht die gesamte Abfrage fest codieren möchten, können Sie die SQL-Anweisung mithilfe von dynamischem SQL generieren:
quelle
UNPIVOT
und Muttern wollen und / vs.APPLY
, dieser Blog-Beitrag von Brad Schulz (und dem Nachfolger ) aus dem Jahr 2010 ist (sind) wunderschön.Wenn Sie 150 Spalten haben, ist UNPIVOT meiner Meinung nach keine Option. Sie könnten also einen XML-Trick verwenden
sql fiddle demo
Sie könnten auch dynamisches SQL schreiben, aber ich mag XML mehr - für dynamisches SQL müssen Sie über Berechtigungen verfügen, um Daten direkt aus der Tabelle auszuwählen, und das ist nicht immer eine Option.
UPDATE
Da es in den Kommentaren eine große Flamme gibt, denke ich, dass ich einige Vor- und Nachteile von XML / Dynamic SQL hinzufügen werde. Ich werde versuchen, so objektiv wie möglich zu sein und Eleganz und Hässlichkeit nicht zu erwähnen. Wenn Sie andere Vor- und Nachteile haben, bearbeiten Sie die Antwort oder schreiben Sie Kommentare
Nachteile
Profis
inserted
unddeleted
Tabellen in Ihrem Trigger abfragen (mit Dynamic überhaupt nicht möglich).quelle
Um neuen Lesern zu helfen, habe ich ein Beispiel erstellt, um die Antwort von @ bluefeet zu UNPIVOT besser zu verstehen.
quelle
Ich brauchte eine Lösung, um Spalten in Zeilen in Microsoft SQL Server zu konvertieren, ohne die Spaltennamen (im Trigger verwendet) und ohne dynamisches SQL zu kennen (dynamisches SQL ist zu langsam für die Verwendung in einem Trigger).
Ich habe endlich diese Lösung gefunden, die gut funktioniert:
Wie Sie sehen können, konvertiere ich die Zeile in XML (Unterabfrage wähle i, * für XML Raw, dies konvertiert alle Spalten in eine XML-Spalte)
Dann wende ich eine Funktion auf jedes XML-Attribut dieser Spalte an, sodass ich eine Zeile pro Attribut erhalte.
Insgesamt werden Spalten in Zeilen konvertiert, ohne die Spaltennamen zu kennen und ohne dynamisches SQL zu verwenden. Es ist schnell genug für meinen Zweck.
(Bearbeiten: Ich habe gerade gesehen, wie Roman Pekar oben geantwortet hat, wer dasselbe tut. Ich habe zuerst den dynamischen SQL-Trigger mit Cursorn verwendet, der 10 bis 100 Mal langsamer war als diese Lösung, aber möglicherweise wurde er durch den Cursor verursacht, nicht durch den Dynamic SQL. Wie auch immer, diese Lösung ist sehr einfach und universell, daher ist sie definitiv eine Option.
Ich hinterlasse diesen Kommentar an dieser Stelle, da ich auf diese Erklärung in meinem Beitrag zum vollständigen Audit-Trigger verweisen möchte, die Sie hier finden: https://stackoverflow.com/a/43800286/4160788
quelle
Sie können eine Liste von Tabellen mit Zeilenzahlen> 350 erhalten. Sie können in der Lösungsliste der Tabelle als Zeile sehen.
quelle
Nur weil ich es nicht erwähnt habe.
Ab 2016+ gibt es hier noch eine weitere Option zum dynamischen Aufheben des Pivots von Daten, ohne Dynamic SQL tatsächlich zu verwenden.
Beispiel
Kehrt zurück
quelle