Ausgabe
Ich wurde gebeten, eine Abfrage zu erstellen, die Daten aus so etwas wie dem ersten Bild mit Standardzeilen/Spalten umwandelt
Year Company Completed DayofWeek Hour Country
---------------------------------------------------------------------
2022 A Y Mon 12 France
2019 A N Tue 14 Germany
2022 A Y Thu 13 Italy
2021 B N Sat 16 France
2022 B Y Mon 14 Spain
2021 B Y Tue 12 France
So etwas wie unten, wo sich eine Reihe von Feldnamen in einer Spalte befinden und die Feldwerte in einer anderen
Company Completed Field Name Field Value Total
---------------------------------------------------------------------
A Y DayofWeek Mon 50
A Y DayofWeek Tue 35
A N DayofWeek Mon 40
A N Hour 16 55
A Y Hour 12 40
A Y Hour 14 30
In der eigentlichen Abfrage werden mehr Spalten transformiert. Ich verwende derzeit viele Gewerkschaftsanweisungen, z
select
Company, Completed, 'Day of Week' as 'Field Name', [Day_of_Week] as 'Field Values', count(*) as Total
from Table 1
where year=2022
Group by
Company, Completed, [Day_of_Week]
union all
select
Company, Completed, 'Hour' as 'Field Name', [Hour] as 'Field Values', count(*) as Total
from Table 1
where year =2022
Group by
Company, Completed, [Hour]
Ich wurde gebeten, dies auf diese Weise zu tun, um weniger Zeilen auszugeben, und auch, da der Kunde in der Lage sein möchte, den abgeschlossenen Prozentsatz für alle Maßnahmen gleichzeitig zu vergleichen.
Ich bin jedoch der Meinung, dass es einen effizienteren Weg geben könnte, nicht so viele Unions zu haben / nicht jede Union manuell zu aktualisieren, wenn Änderungen am Skript vorgenommen werden, aber nichts gefunden wurde – eine Möglichkeit, die verschiedenen Spalten zu durchlaufen, um sie unten hinzuzufügen.
Lösung
Sie können CONVERT
Ihre Spalten, die Sie entpivotieren möchten, in einer Unterabfrage (vorausgesetzt, der Datentyp stimmt Hour, DayofWeek, Country
nicht überein – sie müssen übereinstimmen, damit die PIVOT/UNPIVOT
Funktionen funktionieren) und dann die Funktion ausführen UNPIVOT
, um Ihre Spalten in Zeilen zu drehen.
Die neu erstellte Field_Value
Spalte aus der UNPIVOT
Funktion enthält Ihre Spaltenwerte und Field_Name
Ihre Spaltennamen (Sie können den Alias für diese Spalten ändern, wenn Sie möchten).
Sie können dann eine durchführen GROUP BY
, um Ihre Daten basierend auf Company
, Completed
und Ihren neu erstellten Spalten Field_Name
und zu aggregieren Field_Value
, um eine COUNT
für Ihre Total
Spalte zu erhalten.
SELECT
u.Company,
u.Completed,
u.Field_Name,
u.Field_Value,
COUNT(u.Field_Value) AS Total
FROM
(SELECT
Company,
Completed,
CONVERT(VARCHAR(10), DayofWeek) AS DayofWeek,
CONVERT(VARCHAR(10), Hour) AS Hour,
CONVERT(VARCHAR(10), Country) AS Country
FROM sample_table) pv
UNPIVOT
(Field_Value FOR Field_Name IN (DayofWeek, Hour, Country)) u
GROUP BY u.Company, u.Completed, u.Field_Name, u.Field_Value
ORDER BY u.Company, u.Field_Name ASC
Siehe Geige .
Ergebnis:
Gesellschaft | Abgeschlossen | Feldname | Feldwert | Gesamt |
---|---|---|---|---|
EIN | N | Land | Deutschland | 1 |
EIN | Y | Land | Frankreich | 1 |
EIN | Y | Land | Italien | 1 |
EIN | N | Wochentag | Di | 1 |
EIN | Y | Wochentag | Mo | 1 |
EIN | Y | Wochentag | Do | 1 |
EIN | N | Stunde | 14 | 1 |
EIN | Y | Stunde | 12 | 1 |
EIN | Y | Stunde | 13 | 1 |
B | Y | Land | Frankreich | 2 |
B | Y | Land | Spanien | 1 |
B | Y | Wochentag | Mo | 1 |
B | Y | Wochentag | Sa | 1 |
B | Y | Wochentag | Di | 1 |
B | Y | Stunde | 12 | 1 |
B | Y | Stunde | 14 | 1 |
B | Y | Stunde | 16 | 1 |
** Beachten Sie, dass ich das N-Flag in Y für die Spalte Company B Completed geändert habe, um die GROUP BY
Gesamtarbeit anzuzeigen .
Lesen Sie mehr über PIVOT
und UNPIVOT
hier von Microsoft:
FROM – Using PIVOT and UNPIVOT
Beantwortet von – GRIV
Antwort geprüft von – Timothy Miller (FixError Admin)