Zusammenfassung: In diesem Tutorial lernen Sie das Konzept der Gruppierungssätze kennen und wie Sie die PostgreSQL GROUPING SETS
Klausel verwenden, um mehrere Gruppierungssätze in einer Abfrage zu erzeugen.
Einrichten einer Beispieltabelle
Fangen wir an, indem wir eine neue Tabelle namenssales
für die Demonstration erstellen.
Code language: SQL (Structured Query Language) (sql)
Die Tabelle sales
speichert die Anzahl der verkauften Produkte nach Marke und Segment.
Einführung in PostgreSQL GRUPPENSÄTZE
Ein Gruppierungssatz ist ein Satz von Spalten, nach denen Sie mithilfe der GROUP BY
-Klausel gruppieren.
Ein Gruppierungssatz wird durch eine kommagetrennte Liste von Spalten in Klammern angegeben:
Die folgende Abfrage verwendet beispielsweise die GROUP BY
-Klausel, um die Anzahl der verkauften Produkte nach Marke und Segment zurückzugeben. Mit anderen Worten, sie definiert eine Gruppierungsmenge der Marke und des Segments, die durch (brand, segement)
Code language: SQL (Structured Query Language) (sql)
Die folgende Abfrage findet die Anzahl der von einer Marke verkauften Produkte. Sie definiert eine Gruppierungsmenge (brand)
:
Code language: SQL (Structured Query Language) (sql)
Die folgende Abfrage ermittelt die Anzahl der verkauften Produkte nach Segment. Sie definiert eine Gruppierungsmenge (segment)
:
Code language: SQL (Structured Query Language) (sql)
Die folgende Abfrage ermittelt die Anzahl der verkauften Produkte für alle Marken und Segmente. Sie definiert eine leere Gruppierungsmenge, die durch ()
.
Code language: SQL (Structured Query Language) (sql)
Angenommen, Sie möchten alle Gruppierungsmengen mit einer einzigen Abfrage ermitteln. Um dies zu erreichen, können Sie UNION ALL
verwenden, um alle obigen Abfragen zu kombinieren.
Da UNION ALL
erfordert, dass alle Ergebnissätze die gleiche Anzahl von Spalten mit kompatiblen Datentypen haben, müssen Sie die Abfragen anpassen, indem Sie NULL
zur Auswahlliste der einzelnen Abfragen hinzufügen, wie unten gezeigt:
Code language: SQL (Structured Query Language) (sql)
Diese Abfrage erzeugt einen einzigen Ergebnissatz mit den Aggregaten für alle Gruppierungssätze.
Auch wenn die obige Abfrage wie erwartet funktioniert, hat sie zwei Hauptprobleme:
- Erstens ist sie ziemlich lang.
- Zweitens hat sie ein Leistungsproblem, weil PostgreSQL die
sales
Tabelle für jede Abfrage separat scannen muss.
Um dies effizienter zu machen, bietet PostgreSQL die GROUPING SETS
-Klausel an, die eine Unterklausel der GROUP BY
-Klausel ist.
Die GROUPING SETS
-Klausel ermöglicht es, mehrere Gruppierungssätze in derselben Abfrage zu definieren.
Die allgemeine Syntax der GROUPING SETS
ist wie folgt:
Code language: SQL (Structured Query Language) (sql)
In dieser Syntax gibt es vier Gruppierungsgruppen (c1,c2)
, (c1)
, (c2)
und ()
.
Um diese Syntax auf das obige Beispiel anzuwenden, können Sie die GROUPING SETS
-Klausel anstelle der UNION ALL
-Klausel wie folgt verwenden:
Code language: SQL (Structured Query Language) (sql)
Diese Abfrage ist viel kürzer und besser lesbar. Außerdem optimiert PostgreSQL die Anzahl der Scans der sales
Tabelle und scannt nicht mehrfach.
Gruppierungsfunktion
Die GROUPING()
Funktion akzeptiert ein Argument, das ein Spaltenname oder ein Ausdruck sein kann:
Der column_name
oder expression
muss mit dem in der GROUP BY
Klausel angegebenen übereinstimmen.
Die Funktion GROUPING()
gibt Bit 0 zurück, wenn das Argument ein Mitglied des aktuellen Gruppierungssatzes ist, und ansonsten 1.
Siehe folgendes Beispiel:
Code language: SQL (Structured Query Language) (sql)
Wenn der Wert in grouping_brand
0 ist, zeigt die Spalte sum
die Zwischensumme von brand
an.
Wenn der Wert in grouping_segment
0 ist, zeigt die Spalte Summe die Zwischensumme von segment
an.
Sie können die GROUPING()
-Funktion in der HAVING
-Klausel verwenden, um die Zwischensumme jeder Marke wie folgt zu ermitteln:
In diesem Lernprogramm haben Sie gelernt, wie Sie die PostgreSQL GROUPING SETS
-Funktion verwenden, um mehrere Gruppierungssätze zu erstellen.
- War dieses Tutorium hilfreich?
- JaNein