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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow