- Catégories :
GROUP BY¶
Regroupe les lignes avec les mêmes expressions group-by-item et calcule les fonctions d’agrégation pour le groupe résultant. Une expression de GROUP BY peut être :
Nom de colonne.
Un numéro annonçant une position dans la liste SELECT.
Une expression générale.
- Extensions :
Syntaxe¶
SELECT ...
FROM ...
[ ... ]
GROUP BY groupItem [ , groupItem [ , ... ] ]
[ ... ]
SELECT ...
FROM ...
[ ... ]
GROUP BY ALL
[ ... ]
Où :
groupItem ::= { <column_alias> | <position> | <expr> }
Paramètres¶
column_aliasAlias de colonne figurant dans la liste SELECT du bloc de requête.
positionPosition d’une expression dans la liste SELECT.
exprToute expression sur les tables du périmètre actuel.
GROUP BY ALLSpécifie que tous les éléments de la liste SELECT qui n’utilisent pas de fonctions d’agrégation doivent être utilisés pour le regroupement.
Pour des exemples, reportez-vous à Effectuer un regroupement en fonction de toutes les colonnes.
Notes sur l’utilisation¶
Une clause GROUP BY peut faire référence à des expressions dans la clause de projection par nom ou par position. Si la clause GROUP BY fait référence à un nom, alors chaque référence est résolue comme suit :
Si la requête contient un objet de base de données (par exemple, une table ou une vue) avec un nom de colonne correspondant, la référence est résolue au nom de la colonne.
Sinon, si la clause de projection de SELECT contient un alias d’expression avec un nom correspondant, alors la référence est résolue vers l’alias.
Pour un exemple, voir Precedence when a column name and an alias match.
Si tous les éléments SELECT utilisent des fonctions agrégées, spécifier GROUP BY ALL équivaut à spécifier l’instruction sans la clause GROUP BY.
Par exemple, l’instruction suivante ne comporte que des éléments SELECT qui utilisent des fonctions d’agrégation :
SELECT SUM(amount) FROM mytable GROUP BY ALL;
L’instruction ci-dessus équivaut à ne pas spécifier la clause GROUP by :
SELECT SUM(amount) FROM mytable;
Exemples¶
Les sections suivantes fournissent des exemples d’utilisation de la clause GROUPBY :
Notez que les exemples de chaque section utilisent les données que vous avez configurées dans Configuration des données pour les exemples.
Configuration des données pour les exemples¶
Les exemples de cette section utilisent une table nommée sales et une table nommée product. Pour créer ces tables et insérer les données nécessaires à l’exemple, exécutez les instructions suivantes :
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);
Effectuer un regroupement en fonction d’une colonne¶
Cet exemple montre les recettes brutes par produit, regroupées par product_id (c’est-à-dire le montant total reçu pour chaque produit) :
SELECT product_ID, SUM(retail_price * quantity) AS gross_revenue
FROM sales
GROUP BY product_ID;
+------------+---------------+
| PRODUCT_ID | GROSS_REVENUE |
+============+===============+
| 1 | 6 |
+------------+---------------+
| 2 | 620 |
+------------+---------------+
L’exemple suivant s’appuie sur l’exemple précédent et présente le bénéfice net par produit, regroupé par 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 |
+------------+--------+
Effectuer un regroupement en fonction de plusieurs colonnes¶
L’exemple suivant montre comment effectuer un groupe sur plusieurs colonnes :
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 |
+-------+---------+---------------+
Effectuer un regroupement en fonction de toutes les colonnes¶
L’exemple suivant est équivalent à l’exemple utilisé dans Effectuer un regroupement en fonction de plusieurs colonnes.
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 |
+-------+---------+---------------+
Precedence when a column name and an alias match¶
It is possible (but usually not recommended) to create a query that contains an alias that matches a column name:
SELECT x, some_expression AS x
FROM ...
If a clause contains a name that matches both a column name and an alias, then the clause uses the column name. The following example demonstrates this behavior using a GROUP BY clause:
Créer une table et insérer des lignes :
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');
The following query returns the sum of the salaries of the employees who are active and the sum of the salaries of the employees who are on leave:
SELECT SUM(salary), ANY_VALUE(employment_state)
FROM employees
GROUP BY employment_state;
+-------------+-----------------------------+
| SUM(SALARY) | ANY_VALUE(EMPLOYMENT_STATE) |
|-------------+-----------------------------|
| 140000 | Active |
| 70000 | On leave |
+-------------+-----------------------------+
The next query uses the alias state, which matches the name of a column of the table in the query. When state is used in
the GROUP BY clause, Snowflake interprets it as a reference to the column name, not the alias. This query therefore returns the sum of
the salaries of the employees in the state of California and the sum of the salaries of the employees in the state of Oregon,
yet displays employment_state information (that is, Active) rather than the names of states or provinces.
SELECT SUM(salary), ANY_VALUE(employment_state) AS state
FROM employees
GROUP BY state;
+-------------+--------+
| SUM(SALARY) | STATE |
|-------------+--------|
| 130000 | Active |
| 80000 | Active |
+-------------+--------+