GROUP BY (Transact-SQL)

Aktualisiert: 17. Juli 2006

Gibt die Gruppen an, in denen Ausgabezeilen zusammengefasst werden. GROUP BY berechnet einen Summenwert für jede Gruppe, wenn Aggregatfunktionen in der SELECT-Klausel <select list> enthalten sind. Wenn GROUP BY angegeben wird, muss jede Spalte jedes Nichtaggregatausdrucks in der Auswahlliste in der GROUP BY-Liste eingeschlossen sein, oder der GROUP BY-Ausdruck muss dem Auswahllistenausdruck genau entsprechen.

ms177673.note(de-de,SQL.90).gifHinweis:
Falls die ORDER BY-Klausel nicht angegeben wird, haben die von der GROUP BY-Klausel zurückgegebenen Gruppen keine feste Reihenfolge. Es wird empfohlen, dass Sie immer die ORDER BY-Klausel zum Angeben einer bestimmten Reihenfolge von Daten verwenden.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

[ GROUP BY [ ALL ] group_by_expression [ ,...n ] 
    [ WITH { CUBE | ROLLUP } ] 
] 

Argumente

  • ALL
    Bezieht alle Gruppen und Resultsets ein, auch solche, die keine Zeilen enthalten, welche die in der WHERE-Klausel angegebenen Bedingungen erfüllen. Wenn ALL angegeben wird, werden NULL-Werte für die Summenspalten der Gruppen zurückgegeben, die die Suchbedingung nicht erfüllen. ALL kann nicht mit den Operatoren CUBE oder ROLLUP angegeben werden.

    GROUP BY ALL wird für Abfragen nicht unterstützt, die auf Remotetabellen zugreifen und eine WHERE-Klausel enthalten.

  • group_by_expression
    Ein Ausdruck, für den die Gruppierung ausgeführt wird. group_by_expression wird auch als Gruppierungsspalte bezeichnet. Bei group_by expression kann es sich um Spalten oder Nichtaggregatausdrücke handeln, die auf eine Spalte verweisen, die von der FROM-Klausel zurückgegeben wurde. Ein in der Auswahlliste definierter Spaltenalias kann nicht zum Angeben einer Gruppierungsspalte verwendet werden.

    ms177673.note(de-de,SQL.90).gifHinweis:
    Spalten vom Typ text, ntext und image können in group_by_expression nicht verwendet werden.

    Bei GROUP BY-Klauseln, die weder CUBE noch ROLLUP enthalten, ist die Anzahl von group_by_expression-Elementen durch die GROUP BY-Spaltengrößen, die Aggregatspalten und die Aggregatwerte der Abfrage beschränkt. Diese Beschränkung ergibt sich aus der maximalen Größe von 8.060 Byte der temporären Arbeitstabelle, die für die zwischenzeitlich erstellten Abfrageergebnisse benötigt wird. Bei Angabe von CUBE oder ROLLUP sind höchstens 10 Gruppierungsausdrücke zulässig.

    Methoden für xml-Datentypen können nicht direkt in group_by_expression angegeben werden. Verweisen Sie stattdessen auf eine benutzerdefinierte Funktion, die darin enthaltene xml-Datentypmethoden verwendet, oder verweisen Sie auf eine berechnete Spalte, die sie verwendet.

  • CUBE
    Gibt an, dass zusätzlich zu den normalerweise von GROUP BY bereitgestellten Zeilen auch Summenzeilen in das Resultset aufgenommen werden. Eine GROUP BY-Summenzeile wird für jede mögliche Kombination von Gruppen und Untergruppen im Resultset zurückgegeben. Eine GROUP BY-Summenzeile wird als NULL im Ergebnis angezeigt, dient aber zur Anzeige aller Werte. Verwenden Sie die GROUPING-Funktion, um zu ermitteln, ob alle NULL-Werte im Resultset GROUP BY-Summenwerte sind.

    Die Anzahl von Summenzeilen im Resultset richtet sich nach der Anzahl von Spalten, die in der GROUP BY-Klausel eingeschlossen sind. Jeder Operand (jede Spalte) in der GROUP BY-Klausel wird unter der Gruppierung NULL gebunden, und die Gruppierung wird auf alle anderen Operanden (Spalten) angewendet. Da CUBE jede mögliche Kombination aus Gruppen und Untergruppen zurückgibt, ist die Anzahl von Zeilen unabhängig von der Reihenfolge, in der die Gruppierungsspalten festgelegt werden, immer gleich.

  • ROLLUP
    Gibt an, dass zusätzlich zu den normalerweise von GROUP BY bereitgestellten Zeilen auch Summenzeilen in das Resultset aufgenommen werden. Gruppen werden in hierarchischer Reihenfolge von der niedrigsten Ebene in der Gruppe bis zur höchsten Ebene zusammengefasst. Die Gruppenhierarchie wird durch die Reihenfolge bestimmt, in der die Gruppierungsspalten angegeben werden. Das Ändern der Reihenfolge der Gruppierungsspalten kann sich auf die Anzahl von im Resultset erstellten Zeilen auswirken.

    ms177673.note(de-de,SQL.90).gifWichtig:
    DISTINCT-Aggregate, wie z. B. AVG(DISTINCT column_name), COUNT(DISTINCT column_name) und SUM(DISTINCT column_name), werden nicht unterstützt, wenn CUBE oder ROLLUP verwendet wird. In diesem Fall gibt Microsoft SQL Server 2005-Datenbankmodul eine Fehlermeldung zurück und bricht die Abfrage ab.

Beispiele

A. Verwenden einer einfachen GROUP BY-Klausel

Das folgende Beispiel ruft die Summe für die einzelnen SalesOrderID-Spalten aus der SalesOrderDetail-Tabelle ab.

USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;

B. Verwenden einer GROUP BY-Klausel mit mehreren Tabellen

Im folgenden Beispiel wird die Anzahl von Mitarbeitern für die einzelnen City-Spalten aus der Address-Tabelle, kombiniert mit der EmployeeAddress-Tabelle, abgerufen.

USE AdventureWorks ;
GO
SELECT a.City, COUNT(ea.AddressID) EmployeeCount
FROM HumanResources.EmployeeAddress ea 
INNER JOIN Person.Address a
ON ea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City ;

C. Verwenden einer GROUP BY-Klausel mit einem Ausdruck

Im folgenden Beispiel wird der Gesamtumsatz für jedes Jahr mithilfe der DATEPART-Funktion abgerufen. Derselbe Ausdruck muss sowohl in der Auswahlliste als auch in der GROUP BY-Klausel vorhanden sein.

USE AdventureWorks ;
GO
SELECT DATEPART(yyyy,OrderDate) AS Year,
SUM(TotalDue) AS AverageOrderAmt
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate)
ORDER BY DATEPART(yyyy,OrderDate) ;

Siehe auch

Verweis

SELECT (Transact-SQL)
SELECT-Klausel (Transact-SQL)

Andere Ressourcen

Zusammenfassen von Daten mit CUBE
Zusammenfassen von Daten mit ROLLUP

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

17. Juli 2006

Neuer Inhalt:
  • Beispiel C wurde hinzugefügt.

05. Dezember 2005

Geänderter Inhalt:
  • Beispiel B wurde korrigiert.