- Categorias:
GROUP BY¶
Agrupa linhas com as mesmas expressões grupo por item e calcula as funções agregadas para o grupo resultante. Uma expressão GROUP BY pode ser um nome de coluna, um número que se refere a uma posição na lista SELECT ou uma expressão geral.
- Extensões:
Sintaxe¶
SELECT ...
FROM ...
[ ... ]
GROUP BY groupItem [ , groupItem> [ , ... ] ]
[ ... ]
Onde:
groupItem ::= { <column_alias> | <position> | <expr> }
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 Demonstrar precedência quando um nome de coluna e um alias forem correspondentes.
Exemplos¶
Agrupamento por uma coluna¶
Este exemplo mostra a receita bruta por produto, agrupada por product_id
:
-- Create the sales table and insert some rows. 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'); -- Show the gross revenue, grouped by product_id. -- In other words, show the total amount of money received for -- selling each product. SELECT product_ID, SUM(retail_price * quantity) AS gross_revenue FROM sales GROUP BY product_ID;Saída:
+------------+---------------+ | PRODUCT_ID | GROSS_REVENUE | +============+===============+ | 1 | 6 | +------------+---------------+ | 2 | 620 | +------------+---------------+
Este exemplo se baseia no exemplo anterior, mostrando o lucro líquido por produto, agrupado por product_id
:
-- Create the products table and insert some rows. 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); -- Show the net profit on each product. 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;Saída:
+------------+--------+ | PRODUCT_ID | PROFIT | +============+========+ | 1 | 3 | +------------+--------+ | 2 | 372 | +------------+--------+
Agrupamento por várias colunas¶
Você pode agrupar por várias colunas:
SELECT State, City, SUM(retail_price * quantity) AS gross_revenue FROM sales GROUP BY State, City;Saída:
+-------+---------+---------------+ | STATE | CITY | GROSS REVENUE | +=======+=========+===============+ | CA | SF | 22 | +-------+---------+---------------+ | CA | SJ | 44 | +-------+---------+---------------+ | FL | Miami | 80 | +-------+---------+---------------+ | FL | Orlando | 160 | +-------+---------+---------------+ | PR | SJ | 320 | +-------+---------+---------------+
Demonstrar precedência quando um nome de coluna e um alias forem correspondentes¶
É possível (mas geralmente uma má ideia) criar uma consulta que contenha um alias que corresponda a um nome de coluna:
select x, some_expression as x from ...
Se uma cláusula GROUP BY contém um nome que corresponde ao nome de uma coluna e um alias, então a cláusula GROUP BY usa o nome da coluna. Isto é demonstrado no exemplo abaixo.
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 abaixo usa o alias state
, que corresponde ao nome de uma coluna de uma tabela na consulta. Quando state
é usado no GROUP BY, o Snowflake o interpreta como uma referência ao nome da coluna, e não como o alias. Esta 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 de Oregon, mas exibe informações sobre o estado_emprego (por exemplo “Ativo”) em vez dos nomes de 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 | +-------------+--------+