[FIXED] Union Iterative through Columns/Transforms Columns to Rows

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 CONVERTIhre Spalten, die Sie entpivotieren möchten, in einer Unterabfrage (vorausgesetzt, der Datentyp stimmt Hour, DayofWeek, Countrynicht überein – sie müssen übereinstimmen, damit die PIVOT/UNPIVOTFunktionen funktionieren) und dann die Funktion ausführen UNPIVOT, um Ihre Spalten in Zeilen zu drehen.

Die neu erstellte Field_ValueSpalte aus der UNPIVOTFunktion enthält Ihre Spaltenwerte und Field_NameIhre 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, Completedund Ihren neu erstellten Spalten Field_Nameund zu aggregieren Field_Value, um eine COUNTfür Ihre TotalSpalte 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 BYGesamtarbeit anzuzeigen .

Lesen Sie mehr über PIVOTund UNPIVOThier von Microsoft:
FROM – Using PIVOT and UNPIVOT


Beantwortet von –
GRIV


Antwort geprüft von –
Timothy Miller (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like