Ich habe das Zeug auf MS-Pivot-Tabellen gelesen und habe immer noch Probleme, dies richtig zu machen.
Ich habe eine temporäre Tabelle, die gerade erstellt wird. Wir werden sagen, dass Spalte 1 eine Geschäftsnummer ist und Spalte 2 eine Wochennummer und schließlich Spalte 3 eine Gesamtheit eines Typs. Auch die Wochennummern sind dynamisch, die Geschäftsnummern sind statisch.
Store Week xCount
------- ---- ------
102 1 96
101 1 138
105 1 37
109 1 59
101 2 282
102 2 212
105 2 78
109 2 97
105 3 60
102 3 123
101 3 220
109 3 87
Ich möchte, dass es wie folgt als Pivot-Tisch herauskommt:
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
Speichern Sie die Zahlen unten und die Wochen oben.
sql
sql-server
pivot
pivot-table
Lynn
quelle
quelle
Antworten:
Wenn Sie SQL Server 2005+ verwenden, können Sie die
PIVOT
Funktion verwenden, um die Daten aus Zeilen in Spalten umzuwandeln.Es hört sich so an, als müssten Sie dynamisches SQL verwenden, wenn die Wochen unbekannt sind, aber es ist einfacher, den richtigen Code zunächst mit einer fest codierten Version zu sehen.
Hier sind zunächst einige schnelle Tabellendefinitionen und Daten zur Verwendung:
Wenn Ihre Werte bekannt sind, codieren Sie die Abfrage fest:
Siehe SQL-Demo
Wenn Sie dann die Wochennummer dynamisch generieren müssen, lautet Ihr Code:
Siehe SQL-Demo .
Die dynamische Version generiert die Liste der
week
Zahlen, die in Spalten konvertiert werden sollen. Beide ergeben das gleiche Ergebnis:quelle
cte3 AS (select ... )
dann haben Sie die oben definierte Logik mit dem@cols
und@query
... es liegt ein Fehler vor. "Ungültiger Objektname 'cte3'." Wie beheben Sie das? -STUFF(...)
zuvor (oder dieXML PATH
beiden) verwendet. Zum Nutzen anderer Leser müssen lediglich die Spaltennamen zusammengefügt und das führende Komma abgeschnitten werden. Hinweis Ich denke, das Folgende ist etwas einfacher: Wählen Sie @cols = (SELECT DISTINCT QUOTENAME (Week) + ',' aus Ihrer Reihenfolge um 1 FOR XML PATH ('')) set @cols = SUBSTRING (@cols, 1, LEN ( @cols) - 1) ... Ersetzen desgroup by
bydistinct
undorder by 1
und manuelles Hacken eines angehängten Kommas!Dies gilt für eine dynamische Anzahl von Wochen.
Vollständiges Beispiel hier: SQL Dynamic Pivot
quelle
Ich habe das gleiche schon einmal mit Unterabfragen erreicht. Wenn Ihre ursprüngliche Tabelle StoreCountsByWeek heißt und Sie eine separate Tabelle mit den Store-IDs haben, sieht sie folgendermaßen aus:
Ein Vorteil dieser Methode besteht darin, dass die Syntax klarer ist und es einfacher ist, sich mit anderen Tabellen zu verbinden, um auch andere Felder in die Ergebnisse zu ziehen.
Meine anekdotischen Ergebnisse sind, dass diese Abfrage über ein paar tausend Zeilen ausgeführt wurde, die in weniger als einer Sekunde abgeschlossen wurden, und ich hatte tatsächlich 7 Unterabfragen. Wie in den Kommentaren erwähnt, ist es jedoch rechenintensiver, dies auf diese Weise zu tun. Seien Sie also vorsichtig bei der Verwendung dieser Methode, wenn Sie erwarten, dass sie mit großen Datenmengen ausgeführt wird.
quelle
Folgendes können Sie tun:
DEMO
quelle
Ich schreibe ein sp, das für diesen Zweck nützlich sein könnte. Im Grunde dreht dieses sp jede Tabelle und gibt eine neue Tabelle zurück, die geschwenkt wird, oder gibt nur den Datensatz zurück. Dies ist die Art und Weise, wie es ausgeführt wird:
Bitte beachten Sie, dass im Parameter @agg die Spaltennamen mit sein müssen
'['
und der Parameter mit einem Komma enden muss','
SP
Dies ist ein Beispiel für die Ausführung:
dann
Select * From ##TEMPORAL1PVT
würde zurückkehren:quelle
quelle
Hier ist eine Überarbeitung der obigen Antwort von @Tayrn, die Ihnen helfen könnte, das Schwenken ein wenig einfacher zu verstehen:
Dies ist vielleicht nicht der beste Weg, dies zu tun, aber dies hat mir geholfen, mich mit dem Schwenken von Tischen zu beschäftigen.
ID = Zeilen, die Sie schwenken möchten
MY_KEY = die Spalte, die Sie aus Ihrer ursprünglichen Tabelle auswählen und die die Spaltennamen enthält, die Sie schwenken möchten.
VAL = der Wert, den Sie unter jeder Spalte zurückgeben möchten.
MAX (VAL) => Kann durch andere Aggregatfunktionen ersetzt werden. SUMME (VAL), MIN (VAL), ETC ...
quelle
Geben Sie einfach eine Vorstellung davon, wie andere Datenbanken dieses Problem lösen.
DolphinDB
hat auch eingebaute Unterstützung für das Schwenken und das SQL sieht viel intuitiver und ordentlicher aus. Es ist so einfach wie das Angeben der Schlüsselspalte (Store
), der schwenkbaren Spalte (Week
) und der berechneten Metrik (sum(xCount)
).DolphinDB ist eine spaltenweise Hochleistungsdatenbank. Die Berechnung in der Demo kostet auf einem Dell XPS-Laptop (i7-CPU) nur 546 ms. Weitere Informationen finden Sie im Online-DolphinDB-Handbuch https://www.dolphindb.com/help/index.html?pivotby.html
quelle