Suche…
Einführung
Die Ergebnisse einer SELECT-Abfrage können mithilfe der GROUP BY
Anweisung nach einer oder mehreren Spalten gruppiert werden: Alle Ergebnisse mit dem gleichen Wert in den gruppierten Spalten werden zusammengefasst. Dies erzeugt eine Tabelle mit Teilergebnissen anstelle eines Ergebnisses. GROUP BY kann in Verbindung mit Aggregationsfunktionen mit der Anweisung HAVING
werden, um zu definieren, wie nicht gruppierte Spalten aggregiert werden.
Syntax
GRUPPIERE NACH {
Spaltenausdruck
| ROLLUP (<group_by_expression> [, ... n])
| CUBE (<group_by_expression> [, ... n])
| GROUPING SETS ([, ... n])
| () - berechnet die Gesamtsumme
} [, ... n]<group_by_expression> :: =
Spaltenausdruck
| (Spaltenausdruck [, ... n])<Gruppierungssatz> :: =
() - berechnet die Gesamtsumme
| <grouping_set_item>
| (<grouping_set_item> [, ... n])<grouping_set_item> :: =
<group_by_expression>
| ROLLUP (<group_by_expression> [, ... n])
| CUBE (<group_by_expression> [, ... n])
USE GROUP BY COUNT die Anzahl der Zeilen für jeden eindeutigen Eintrag in einer bestimmten Spalte
Angenommen, Sie möchten für einen bestimmten Wert in einer Spalte Zählungen oder Zwischensummen generieren.
Angesichts dieser Tabelle "Westerosians":
Name | GreatHouseAllegience |
---|---|
Arya | Stark |
Cercei | Lannister |
Myrcella | Lannister |
Yara | Greyjoy |
Catelyn | Stark |
Sansa | Stark |
Ohne GROUP BY wird COUNT einfach eine Gesamtanzahl von Zeilen zurückgeben:
SELECT Count(*) Number_of_Westerosians
FROM Westerosians
kehrt zurück...
Anzahl_der_Westerosianer |
---|
6 |
Durch das Hinzufügen von GROUP BY können wir die Benutzer für jeden Wert in einer bestimmten Spalte ZÄHLEN, um die Anzahl der Personen in einem bestimmten Großen Haus zurückzugeben.
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
kehrt zurück...
Haus | Anzahl_der_Westerosianer |
---|---|
Stark | 3 |
Greyjoy | 1 |
Lannister | 2 |
Es ist üblich, GROUP BY mit ORDER BY zu kombinieren, um die Ergebnisse nach der größten oder kleinsten Kategorie zu sortieren:
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
ORDER BY Number_of_Westerosians Desc
kehrt zurück...
Haus | Anzahl_der_Westerosianer |
---|---|
Stark | 3 |
Lannister | 2 |
Greyjoy | 1 |
Filtern Sie die GROUP BY-Ergebnisse mit einer HAVING-Klausel
Eine HAVING-Klausel filtert die Ergebnisse eines GROUP BY-Ausdrucks. Hinweis: Die folgenden Beispiele verwenden die Bibliotheksbeispieldatenbank .
Beispiele:
Gib alle Autoren zurück, die mehr als ein Buch geschrieben haben ( Live-Beispiel ).
SELECT
a.Id,
a.Name,
COUNT(*) BooksWritten
FROM BooksAuthors ba
INNER JOIN Authors a ON a.id = ba.authorid
GROUP BY
a.Id,
a.Name
HAVING COUNT(*) > 1 -- equals to HAVING BooksWritten > 1
;
Alle Bücher zurückgeben, die mehr als drei Autoren haben ( Live-Beispiel ).
SELECT
b.Id,
b.Title,
COUNT(*) NumberOfAuthors
FROM BooksAuthors ba
INNER JOIN Books b ON b.id = ba.bookid
GROUP BY
b.Id,
b.Title
HAVING COUNT(*) > 3 -- equals to HAVING NumberOfAuthors > 3
;
Grundlegendes GROUP BY-Beispiel
Es ist möglicherweise einfacher, wenn Sie sich GROUP OF BY als "für jeden" zur Erklärung ansehen. Die Abfrage unten:
SELECT EmpID, SUM (MonthlySalary)
FROM Employee
GROUP BY EmpID
sagt:
"Gib mir die Summe der MonthlySalary's für jede EmpID"
Wenn also Ihr Tisch so aussah:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|2 |300 |
+-----+-------------+
Ergebnis:
+-+---+
|1|200|
+-+---+
|2|300|
+-+---+
Sum würde scheinbar nichts tun, da die Summe einer Zahl diese Zahl ist. Andererseits, wenn es so aussah:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|1 |300 |
+-----+-------------+
|2 |300 |
+-----+-------------+
Ergebnis:
+-+---+
|1|500|
+-+---+
|2|300|
+-+---+
Dann wäre es, weil es zwei EmpID 1 gibt, die zusammenzufassen sind.
ROLAP-Aggregation (Data Mining)
Beschreibung
Der SQL-Standard bietet zwei zusätzliche Aggregatoperatoren. Diese verwenden den polymorphen Wert "ALL", um die Menge aller Werte anzugeben, die ein Attribut annehmen kann. Die zwei Operatoren sind:
-
with data cube
werden alle möglichen Kombinationen als die Argumentattribute der Klausel bereitgestellt. -
with roll up
werden die Aggregate bereitgestellt, die sich aus der Reihenfolge der Attribute von links nach rechts ergeben, verglichen mit der Auflistung im Argument der Klausel.
SQL-Standardversionen, die diese Funktionen unterstützen: 1999,2003,2006,2008,2011.
Beispiele
Betrachten Sie diese Tabelle:
Essen | Marke | Gesamtmenge |
---|---|---|
Pasta | Brand1 | 100 |
Pasta | Brand2 | 250 |
Pizza | Brand2 | 300 |
Mit Würfel
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with cube
Essen | Marke | Gesamtmenge |
---|---|---|
Pasta | Brand1 | 100 |
Pasta | Brand2 | 250 |
Pasta | ALLES | 350 |
Pizza | Brand2 | 300 |
Pizza | ALLES | 300 |
ALLES | Brand1 | 100 |
ALLES | Brand2 | 550 |
ALLES | ALLES | 650 |
Mit aufrollen
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with roll up
Essen | Marke | Gesamtmenge |
---|---|---|
Pasta | Brand1 | 100 |
Pasta | Brand2 | 250 |
Pizza | Brand2 | 300 |
Pasta | ALLES | 350 |
Pizza | ALLES | 300 |
ALLES | ALLES | 650 |