Ich bin sehr neu in SQL.
Ich habe einen Tisch wie diesen:
ID | TeamID | UserID | ElementID | PhaseID | Effort
-----------------------------------------------------
1 | 1 | 1 | 3 | 5 | 6.74
2 | 1 | 1 | 3 | 6 | 8.25
3 | 1 | 1 | 4 | 1 | 2.23
4 | 1 | 1 | 4 | 5 | 6.8
5 | 1 | 1 | 4 | 6 | 1.5
Und mir wurde gesagt, ich solle solche Daten bekommen
ElementID | PhaseID1 | PhaseID5 | PhaseID6
--------------------------------------------
3 | NULL | 6.74 | 8.25
4 | 2.23 | 6.8 | 1.5
Ich verstehe, dass ich die PIVOT-Funktion verwenden muss. Kann es aber nicht klar verstehen. Es wäre eine große Hilfe, wenn jemand dies im obigen Fall erklären könnte (oder gegebenenfalls Alternativen).
sql-server
sql-server-2008
tsql
pivot
Wir sind
quelle
quelle
PhaseID
vor QUOTENAME hart codieren muss. Recht?SELECT distinct '],['
, musste ich dies tun , und auch am Ende der Anweisung1, 2, '') + ']'
Dies sind die sehr grundlegenden Pivot-Beispiele.
Beispiele für SQL SERVER - PIVOT- und UNPIVOT-Tabellen
Beispiel vom obigen Link für die Produkttabelle:
SELECT PRODUCT, FRED, KATE FROM ( SELECT CUST, PRODUCT, QTY FROM Product) up PIVOT (SUM(QTY) FOR CUST IN (FRED, KATE)) AS pvt ORDER BY PRODUCT
rendert:
PRODUCT FRED KATE -------------------- BEER 24 12 MILK 3 1 SODA NULL 6 VEG NULL 5
Ähnliche Beispiele finden Sie in den Pivot-Tabellen des Blogposts in SQL Server. Ein einfaches Beispiel
quelle
SELECT CUST, VEG, SODA FROM (SELECT rand() as x, CUST, PRODUCT, QTY FROM Product) up PIVOT ( SUM(x) FOR PRODUCT IN (VEG, SODA) ) AS pvt ORDER BY CUST GO
Damit dies funktioniert, müssen Sie dieqty
Spalte aus der Quelle entfernenIch muss hier etwas hinzufügen, das niemand erwähnt hat.
Die
pivot
Funktion funktioniert hervorragend, wenn die Quelle drei Spalten enthält: eine für dieaggregate
, eine als Spalte mitfor
und eine als Drehpunkt für dierow
Verteilung. Im Produktbeispiel ist esQTY, CUST, PRODUCT
.Wenn Sie jedoch mehr Spalten in der Quelle haben, werden die Ergebnisse in mehrere Zeilen anstatt in eine Zeile pro Pivot aufgeteilt, basierend auf eindeutigen Werten pro zusätzlicher Spalte (wie
Group By
dies bei einer einfachen Abfrage der Fall wäre).In diesem Beispiel habe ich der Quelltabelle eine Zeitstempelspalte hinzugefügt:
Jetzt sehen Sie seine Auswirkungen:
SELECT CUST, MILK FROM Product -- FROM (SELECT CUST, Product, QTY FROM PRODUCT) p PIVOT ( SUM(QTY) FOR PRODUCT IN (MILK) ) AS pvt ORDER BY CUST
Um dies zu beheben, können Sie entweder eine Unterabfrage als Quelle abrufen, wie dies alle oben getan haben - mit nur 3 Spalten (dies funktioniert in Ihrem Szenario nicht immer, stellen Sie sich vor, Sie müssen eine
where
Bedingung für den Zeitstempel festlegen).Die zweite Lösung besteht darin, a zu verwenden
group by
und erneut eine Summe der geschwenkten Spaltenwerte zu erstellen.SELECT CUST, sum(MILK) t_MILK FROM Product PIVOT ( SUM(QTY) FOR PRODUCT IN (MILK) ) AS pvt GROUP BY CUST ORDER BY CUST GO
quelle
Ein Schwenk wird verwendet , um aus Zeilen in Spalten in Ihrem Datensatz eine der Spalten zu konvertieren (dies ist in der Regel bezeichnet als die Verbreitung Spalte ). In dem von Ihnen angegebenen Beispiel bedeutet dies, dass die
PhaseID
Zeilen in eine Reihe von Spalten konvertiert werden , wobei für jeden einzelnen Wert eine Spalte vorhanden istPhaseID
, die in diesem Fall 1, 5 und 6 enthalten kann.Diese geschwenkten Werte werden in dem von Ihnen angegebenen Beispiel über die Spalte gruppiert
ElementID
.In der Regel müssen Sie dann auch eine Form der Aggregation angeben , die Ihnen die Werte liefert, auf die durch den Schnittpunkt des Spreizwerts (
PhaseID
) und des Gruppierungswerts (ElementID
) verwiesen wird . In dem gegebenen Beispiel ist die verwendete Aggregation zwar unklar, betrifft aber dieEffort
Spalte.Sobald dieses Schwenken abgeschlossen ist, werden die Gruppierungs- und Spreizspalten verwendet, um einen Aggregationswert zu finden . Oder in Ihrem Fall
ElementID
undPhaseIDX
suchenEffort
.Bei Verwendung der Terminologie für Gruppierung, Verteilung und Aggregation wird die Beispielsyntax für einen Pivot normalerweise wie folgt angezeigt:
WITH PivotData AS ( SELECT <grouping column> , <spreading column> , <aggregation column> FROM <source table> ) SELECT <grouping column>, <distinct spreading values> FROM PivotData PIVOT (<aggregation function>(<aggregation column>) FOR <spreading column> IN <distinct spreading values>));
Dies gibt eine grafische Erklärung, wie die Gruppierungs-, Spreiz- und Aggregationsspalten von der Quelle in schwenkbare Tabellen konvertiert werden, wenn dies weiter hilft.
quelle
Kompatibilitätsfehler einstellen
Verwenden Sie diese Option, bevor Sie die Pivot-Funktion verwenden
ALTER DATABASE [dbname] SET COMPATIBILITY_LEVEL = 100
quelle
SELECT <non-pivoted column>, [first pivoted column] AS <column name>, [second pivoted column] AS <column name>, ... [last pivoted column] AS <column name> FROM (<SELECT query that produces the data>) AS <alias for the source query> PIVOT ( <aggregation function>(<column being aggregated>) FOR [<column that contains the values that will become column headers>] IN ( [first pivoted column], [second pivoted column], ... [last pivoted column]) ) AS <alias for the pivot table> <optional ORDER BY clause>; USE AdventureWorks2008R2 ; GO SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost FROM Production.Product GROUP BY DaysToManufacture; DaysToManufacture AverageCost 0 5.0885 1 223.88 2 359.1082 4 949.4105 -- Pivot table with one row and five columns SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] FROM (SELECT DaysToManufacture, StandardCost FROM Production.Product) AS SourceTable PIVOT ( AVG(StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS PivotTable; Here is the result set. Cost_Sorted_By_Production_Days 0 1 2 3 4 AverageCost 5.0885 223.88 359.1082 NULL 949.4105
quelle
<SELECT query that produces the data>
nicht nur Tisch?