- 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 GROUP BY¶
GROUP BY é compatível com as seguintes extensões que fornecem recursos de agregação poderosos:
GROUP BY GROUPING SETS: calcular várias cláusulas GROUP BY em uma única instrução
GROUP BY ROLLUP: gerar linhas de subtotal para dados hierárquicos
GROUP BY CUBE : gerar linhas de subtotal para todas as combinações de dimensões
Você pode combinar essas extensões com colunas GROUP BY regulares. Por exemplo:
GROUP BY x, GROUPING SETS(y, z)GROUP BY x, ROLLUP(y, z)GROUP BY x, CUBE(y, z)
Para obter mais informações sobre como interpretar valores NULL nos resultados da extensão, consulte a função utilitária GROUPING.
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, cada referência será resolvida da seguinte forma:
Se a consulta contiver um objeto de banco de dados (por exemplo, uma tabela ou exibição) com um nome de coluna correspondente, a referência será 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, a referência será resolvida para o alias.
Para obter um exemplo, consulte Precedência quando um nome de coluna e um alias são iguais.
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 os seguintes comandos:
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, o valor total recebido 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 |
+-------+---------+---------------+
Precedência quando um nome de coluna e um alias são iguais¶
É possível (mas, geralmente, não recomendado) criar uma consulta que contenha um alias igual a um nome de coluna:
SELECT x, some_expression AS x
FROM ...
Se uma cláusula contém um nome que corresponde ao nome de uma coluna e a um alias, a cláusula usa o nome da coluna. O exemplo a seguir demonstra esse comportamento usando uma cláusula GROUP BY:
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');
A consulta abaixo retorna a soma dos salários dos funcionários que estão ativos e a soma dos salários dos funcionários que estão de licença:
SELECT SUM(salary), ANY_VALUE(employment_state)
FROM employees
GROUP BY employment_state;
+-------------+-----------------------------+
| SUM(SALARY) | ANY_VALUE(EMPLOYMENT_STATE) |
|-------------+-----------------------------|
| 140000 | Active |
| 70000 | On leave |
+-------------+-----------------------------+
A consulta seguinte usa o alias state, que corresponde ao nome de uma coluna da tabela na consulta. Quando state é usado na cláusula GROUP BY, o Snowflake o interpreta como uma referência ao nome da coluna, e não ao alias. Essa consulta, portanto, retorna a soma dos salários dos funcionários no estado da Califórnia e a soma dos salários dos funcionários no estado do Oregon, mas exibe informações de employment_state, como Active, em vez dos nomes dos estados ou províncias:
SELECT SUM(salary), ANY_VALUE(employment_state) AS state
FROM employees
GROUP BY state;
+-------------+--------+
| SUM(SALARY) | STATE |
|-------------+--------|
| 130000 | Active |
| 80000 | Active |
+-------------+--------+