- Kategorien:
GROUP BY¶
Gruppiert Zeilen mit denselben Ausdrücken zum Gruppieren nach Elementen und berechnet Aggregatfunktionen für die resultierende Gruppe. Ein GROUP BY-Ausdruck kann Folgendes sein:
Ein Spaltenname.
Eine Nummer, die auf eine Position in der SELECT-Liste verweist.
Ein allgemeiner Ausdruck.
- Erweiterungen:
Syntax¶
SELECT ...
FROM ...
[ ... ]
GROUP BY groupItem [ , groupItem [ , ... ] ]
[ ... ]
SELECT ...
FROM ...
[ ... ]
GROUP BY ALL
[ ... ]
Wobei:
GROUP BY groupItem [ , groupItem [ , ... ] ]
Gibt die Spaltenaliasse, Positionen oder Ausdrücke an, die für die Gruppierung verwendet werden sollen. Verwenden Sie für jede Gruppenelement
groupItem
die folgende Syntax:groupItem ::= { <column_alias> | <position> | <expr> }
Wobei:
GROUP BY ALL
Gibt an, dass alle Elemente in der SELECT-Liste, die keine Aggregatfunktionen verwenden, für das Gruppieren verwendet werden sollen.
Beispiele finden Sie unter Gruppieren nach allen Spalten.
Nutzungshinweise¶
Eine GROUP BY-Klausel kann auf Ausdrücke in der Projektionsklausel nach „name“ oder nach „position“ verweisen. Wenn die GROUP BY-Klausel nach „name“ referenziert, wird jede Referenz wie folgt aufgelöst:
Wenn die Abfrage ein Datenbankobjekt (z. B. Tabelle oder View) mit einem übereinstimmenden Spaltennamen enthält, wird die Referenz in den Spaltennamen aufgelöst.
Wenn aber die Projektionsklausel von SELECT einen Alias-Ausdruck mit einem übereinstimmenden Namen enthält, wird die Referenz in den Alias aufgelöst.
Ein Beispiel dazu finden Sie unter Rangfolge bei Übereinstimmung von Spaltenname und Alias.
Wenn alle SELECT-Elemente Aggregatfunktionen verwenden, ist die Angabe von GROUP BY ALL gleichbedeutend mit der Angabe der Anweisung ohne GROUP BY-Klausel.
Die folgende Anweisung enthält zum Beispiel nur SELECT-Elemente, die Aggregatfunktionen verwenden:
SELECT SUM(amount) FROM mytable GROUP BY ALL;
Die obige Anweisung ist gleichbedeutend mit der Nichtangabe der GROUP BY-Klausel:
SELECT SUM(amount) FROM mytable;
Beispiele¶
Die folgenden Abschnitte enthalten Beispiele für die Verwendung der GROUP BY-Klausel:
Beachten Sie, dass die Beispiele in den einzelnen Abschnitten die Daten verwenden, die Sie unter Einrichten der Daten für die Beispiele eingerichtet haben.
Einrichten der Daten für die Beispiele¶
Die Beispiele in diesem Abschnitt verwenden eine Tabelle namens sales
und eine Tabelle namens product
. Um diese Tabellen zu erstellen und die für das Beispiel benötigten Daten einzufügen, führen Sie die folgenden Anweisungen aus:
CREATE TABLE sales (
product_ID INTEGER,
retail_price REAL,
quantity INTEGER,
city VARCHAR,
state VARCHAR);
INSERT INTO sales (product_id, retail_price, quantity, city, state) VALUES
(1, 2.00, 1, 'SF', 'CA'),
(1, 2.00, 2, 'SJ', 'CA'),
(2, 5.00, 4, 'SF', 'CA'),
(2, 5.00, 8, 'SJ', 'CA'),
(2, 5.00, 16, 'Miami', 'FL'),
(2, 5.00, 32, 'Orlando', 'FL'),
(2, 5.00, 64, 'SJ', 'PR');
CREATE TABLE products (
product_ID INTEGER,
wholesale_price REAL);
INSERT INTO products (product_ID, wholesale_price) VALUES (1, 1.00);
INSERT INTO products (product_ID, wholesale_price) VALUES (2, 2.00);
Gruppieren nach einer Spalte¶
In diesem Beispiel wird der Bruttoumsatz pro Produkt angezeigt, gruppiert nach product_id
(d. h. der Gesamtbetrag der Einnahmen für jedes Produkt):
SELECT product_ID, SUM(retail_price * quantity) AS gross_revenue
FROM sales
GROUP BY product_ID;
+------------+---------------+
| PRODUCT_ID | GROSS_REVENUE |
+============+===============+
| 1 | 6 |
+------------+---------------+
| 2 | 620 |
+------------+---------------+
Das folgende Beispiel baut auf dem vorherigen Beispiel auf und zeigt den Nettogewinn pro Produkt an, gruppiert nach product_id
:
SELECT p.product_ID, SUM((s.retail_price - p.wholesale_price) * s.quantity) AS profit
FROM products AS p, sales AS s
WHERE s.product_ID = p.product_ID
GROUP BY p.product_ID;
+------------+--------+
| PRODUCT_ID | PROFIT |
+============+========+
| 1 | 3 |
+------------+--------+
| 2 | 372 |
+------------+--------+
Gruppieren nach mehreren Spalten¶
Das folgende Beispiel veranschaulicht, wie Sie nach mehreren Spalten gruppieren können:
SELECT state, city, SUM(retail_price * quantity) AS gross_revenue
FROM sales
GROUP BY state, city;
+-------+---------+---------------+
| STATE | CITY | GROSS REVENUE |
+=======+=========+===============+
| CA | SF | 22 |
+-------+---------+---------------+
| CA | SJ | 44 |
+-------+---------+---------------+
| FL | Miami | 80 |
+-------+---------+---------------+
| FL | Orlando | 160 |
+-------+---------+---------------+
| PR | SJ | 320 |
+-------+---------+---------------+
Gruppieren nach allen Spalten¶
Das folgende Beispiel entspricht dem unter Gruppieren nach mehreren Spalten verwendeten Beispiel.
SELECT state, city, SUM(retail_price * quantity) AS gross_revenue
FROM sales
GROUP BY ALL;
+-------+---------+---------------+
| STATE | CITY | GROSS REVENUE |
+=======+=========+===============+
| CA | SF | 22 |
+-------+---------+---------------+
| CA | SJ | 44 |
+-------+---------+---------------+
| FL | Miami | 80 |
+-------+---------+---------------+
| FL | Orlando | 160 |
+-------+---------+---------------+
| PR | SJ | 320 |
+-------+---------+---------------+
Rangfolge bei Übereinstimmung von Spaltenname und Alias¶
Es ist möglich (aber normalerweise keine gute Idee), eine Abfrage zu erstellen, die einen Alias enthält, der mit einem Spaltennamen übereinstimmt:
SELECT x, some_expression AS x
FROM ...
Wenn eine GROUP BY-Klausel einen Namen enthält, der sowohl mit einem Spaltennamen als auch mit einem Alias übereinstimmt, dann verwendet die GROUP BY-Klausel den Spaltennamen. Dies wird im Beispiel unten veranschaulicht.
Erstellen Sie eine Tabelle, und fügen Sie Zeilen ein:
Create table employees (salary float, state varchar, employment_state varchar); insert into employees (salary, state, employment_state) values (60000, 'California', 'Active'), (70000, 'California', 'On leave'), (80000, 'Oregon', 'Active');
Die folgende Abfrage gibt die Summe der Gehälter der aktiven Mitarbeiter zurück sowie die Summe der Gehälter der Mitarbeiter, die im Urlaub sind.
select sum(salary), ANY_VALUE(employment_state) from employees group by employment_state; +-------------+-----------------------------+ | SUM(SALARY) | ANY_VALUE(EMPLOYMENT_STATE) | |-------------+-----------------------------| | 140000 | Active | | 70000 | On leave | +-------------+-----------------------------+
Die nachstehende Abfrage verwendet den Alias state
, der mit dem Namen einer Spalte in einer Tabelle der Abfrage übereinstimmt. Wenn state
in GROUP BY verwendet wird, interpretiert Snowflake dies als Verweis auf den Spaltennamen, nicht auf den Alias. Diese Abfrage gibt also die Summe der Gehälter der Beschäftigten im Bundesstaat Kalifornien und die Summe der Gehälter der Beschäftigten im Bundesstaat Oregon zurück, zeigt aber dennoch Informationen zum Beschäftigungsstatus (employment_state) an (z. B. „Active“) und nicht die Namen von Bundesstaaten oder Provinzen.
select sum(salary), ANY_VALUE(employment_state) as state from employees group by state; +-------------+--------+ | SUM(SALARY) | STATE | |-------------+--------| | 130000 | Active | | 80000 | Active | +-------------+--------+