Ich wurde beauftragt, ein Mittel zur Übersetzung der folgenden Daten zu finden:
date category amount
1/1/2012 ABC 1000.00
2/1/2012 DEF 500.00
2/1/2012 GHI 800.00
2/10/2012 DEF 700.00
3/1/2012 ABC 1100.00
in die folgenden:
date ABC DEF GHI
1/1/2012 1000.00
2/1/2012 500.00
2/1/2012 800.00
2/10/2012 700.00
3/1/2012 1100.00
Die leeren Stellen können NULL oder Leerzeichen sein, entweder ist das in Ordnung, und die Kategorien müssten dynamisch sein. Eine weitere mögliche Einschränkung besteht darin, dass die Abfrage in einer begrenzten Kapazität ausgeführt wird, was bedeutet, dass temporäre Tabellen nicht verfügbar sind. Ich habe versucht zu recherchieren und bin darauf gelandet, PIVOT
aber da ich das noch nie benutzt habe, verstehe ich es wirklich nicht, trotz meiner besten Bemühungen, es herauszufinden. Kann mich jemand in die richtige Richtung weisen?
sql
sql-server
tsql
pivot
Sean Cunningham
quelle
quelle
Antworten:
Dynamisches SQL PIVOT:
Ergebnisse:
quelle
@cols
Sie die entfernenDISTINCT
und verwendenGROUP BY
undORDER BY
wenn Sie die Liste von erhalten@cols
.Dynamisches SQL PIVOT
Unterschiedlicher Ansatz zum Erstellen von Spaltenzeichenfolgen
Ergebnis
quelle
Ich weiß, dass diese Frage älter ist, aber ich habe die Antworten durchgesehen und dachte, ich könnte den "dynamischen" Teil des Problems erweitern und möglicherweise jemandem helfen.
In erster Linie habe ich diese Lösung entwickelt, um ein Problem zu lösen, das einige Mitarbeiter mit inkonstanten und großen Datenmengen hatten, die schnell geschwenkt werden mussten.
Diese Lösung erfordert die Erstellung einer gespeicherten Prozedur. Wenn dies für Ihre Anforderungen nicht in Frage kommt, hören Sie jetzt bitte auf zu lesen.
Bei dieser Prozedur werden die Schlüsselvariablen einer Pivot-Anweisung berücksichtigt, um dynamisch Pivot-Anweisungen für verschiedene Tabellen, Spaltennamen und Aggregate zu erstellen. Die Spalte "Statisch" wird als Spalte "Gruppieren nach / Identität" für den Pivot verwendet (diese kann bei Bedarf aus dem Code entfernt werden, ist jedoch in Pivot-Anweisungen häufig anzutreffen und war zur Lösung des ursprünglichen Problems erforderlich) Die resultierenden Spaltennamen am Ende werden generiert, und auf die Wertespalte wird das Aggregat angewendet. Der Table-Parameter ist der Name der Tabelle, einschließlich des Schemas (schema.tabellenname). Dieser Teil des Codes könnte etwas Liebe gebrauchen, da er nicht so sauber ist, wie ich es gerne hätte. Es hat bei mir funktioniert, weil meine Nutzung nicht öffentlich zugänglich war und die SQL-Injektion kein Problem darstellte.
Beginnen wir mit dem Code zum Erstellen der gespeicherten Prozedur. Dieser Code sollte in allen Versionen von SSMS 2005 und höher funktionieren, aber ich habe ihn 2005 oder 2016 nicht getestet, kann aber nicht erkennen, warum er nicht funktionieren würde.
Als nächstes bereiten wir unsere Daten für das Beispiel vor. Ich habe das Datenbeispiel der akzeptierten Antwort mit einigen Datenelementen entnommen, die in diesem Proof of Concept verwendet werden sollen, um die unterschiedlichen Ergebnisse der aggregierten Änderung zu zeigen.
Die folgenden Beispiele zeigen die verschiedenen Ausführungsanweisungen, die die verschiedenen Aggregate als einfaches Beispiel zeigen. Ich habe mich nicht dafür entschieden, die statischen, Pivot- und Wertespalten zu ändern, um das Beispiel einfach zu halten. Sie sollten in der Lage sein, den Code einfach zu kopieren und einzufügen, um selbst damit herumzuspielen
Diese Ausführung gibt jeweils die folgenden Datensätze zurück.
quelle
Aktualisierte Version für SQL Server 2017 mit der Funktion STRING_AGG zum Erstellen der Pivot-Spaltenliste:
quelle
Sie können dies mit dynamischem TSQL erreichen (denken Sie daran, QUOTENAME zu verwenden, um SQL-Injection-Angriffe zu vermeiden):
Pivots mit dynamischen Spalten in SQL Server 2005
SQL Server - Dynamische PIVOT-Tabelle - SQL Injection
Obligatorischer Verweis auf den Fluch und den Segen von Dynamic SQL
quelle
QUOTENAME
hilft SQL-Injection-Angriffen nur, wenn Sie @tableName als Parameter von einem Benutzer akzeptieren und an eine Abfrage wie anhängenSET @sql = 'SELECT * FROM ' + @tableName;
. Sie können viele anfällige dynamische SQL-Zeichenfolgen erstellen undQUOTENAME
werden nicht lecken, um Ihnen zu helfen.Es gibt meine Lösung, die die unnötigen Nullwerte bereinigt
quelle
Der folgende Code liefert die Ergebnisse, die NULL in der Ausgabe durch Null ersetzen .
Tabellenerstellung und Dateneinfügung:
Abfrage, um die genauen Ergebnisse zu generieren, die auch NULL durch Nullen ersetzen:
AUSGABE :
quelle