- Categorias:
GROUP BY¶
Agrupa linhas com as mesmas expressões grupo por item e calcula as funções agregadas para o grupo resultante. A expressão GROUP BY pode ser:
Um nome da coluna.
Um número que faz referência a uma posição na lista SELECT.
Uma expressão geral.
- Extensões:
Sintaxe¶
SELECT ...
FROM ...
[ ... ]
GROUP BY groupItem [ , groupItem [ , ... ] ]
[ ... ]
SELECT ...
FROM ...
[ ... ]
GROUP BY ALL
[ ... ]
Onde:
groupItem ::= { <column_alias> | <position> | <expr> }
Parâmetros¶
column_aliasAlias de coluna que aparece na lista SELECT do bloco de consulta.
positionPosição de uma expressão na lista SELECT.
exprQualquer expressão em tabelas no escopo atual.
GROUP BY ALLEspecifica que todos os itens nas listas SELECT que não usem funções de agregação devem ser usadas para agrupamento.
Para obter exemplos, consulte Agrupamento por todas as colunas.
Notas de uso¶
Uma cláusula GROUP BY pode fazer referência a expressões na cláusula de projeção por nome ou por posição. Se a cláusula GROUP BY fizer referência por nome, então cada referência é resolvida da seguinte forma:
Se a consulta contém um objeto de banco de dados (por exemplo, tabela ou exibição) com um nome de coluna correspondente, então a referência é resolvida para o nome da coluna.
Caso contrário, se a cláusula de projeção de SELECT contiver um alias de expressão com um nome correspondente, então a referência é resolvida para o alias.
Para obter um exemplo, consulte Precedence when a column name and an alias match.
Eu todos os itens SELECT usarem funções agregadas, a especificação de GROUP BY ALL é equivalente a especificar a instrução sem a cláusula GROUP BY.
Por exemplo, a seguinte instrução só tem itens SELECT que usam funções de agregação:
SELECT SUM(amount) FROM mytable GROUP BY ALL;
A instrução acima equivale a não especificar o GROUP por cláusula:
SELECT SUM(amount) FROM mytable;
Exemplos¶
As seções a seguir fornecem exemplos de uso de uma cláusula GROUP BY:
Observe que os exemplos em cada seção usam os dados que você configurou em Configuração dos dados para os exemplos.
Configuração dos dados para os exemplos¶
Os exemplos nesta seção usam uma tabela chamada sales e uma tabela chamada product. Para criar essas tabelas e inserir os dados necessários para o exemplo, execute as seguintes instruções:
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);
Agrupamento por uma coluna¶
Este exemplo mostra a receita bruta por produto, agrupada por product_id (ou seja, a quantia total de dinheiro recebida por cada produto):
SELECT product_ID, SUM(retail_price * quantity) AS gross_revenue
FROM sales
GROUP BY product_ID;
+------------+---------------+
| PRODUCT_ID | GROSS_REVENUE |
+============+===============+
| 1 | 6 |
+------------+---------------+
| 2 | 620 |
+------------+---------------+
O seguinte exemplo se baseia no exemplo anterior, mostrando o lucro líquido por produto, agrupado por 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 |
+------------+--------+
Agrupamento por várias colunas¶
O exemplo a seguir demonstra como agrupar por várias colunas:
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 |
+-------+---------+---------------+
Agrupamento por todas as colunas¶
O exemplo a seguir é equivalente ao exemplo usado em Agrupamento por várias colunas.
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:
Criar uma tabela e inserir linhas:
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 |
+-------------+--------+