Categorias:

Sintaxe de consulta

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:

GROUP BY CUBE , GROUP BY GROUPING SETS , GROUP BY ROLLUP

Sintaxe

SELECT ...
FROM ...
[ ... ]
GROUP BY groupItem [ , groupItem> [ , ... ] ]
[ ... ]
Copy

Onde:

groupItem ::= { <column_alias> | <position> | <expr> }
Copy
column_alias

Alias de coluna que aparece na lista SELECT do bloco de consulta.

position

Posição de uma expressão na lista SELECT.

expr

Qualquer expressão em tabelas no escopo atual.

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;
Copy

Saída:

+------------+---------------+
| PRODUCT_ID | GROSS_REVENUE |
+============+===============+
|          1 |          6    |
+------------+---------------+
|          2 |        620    |
+------------+---------------+
Copy

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;
Copy

Saída:

+------------+--------+
| PRODUCT_ID | PROFIT |
+============+========+
|          1 |      3 |
+------------+--------+
|          2 |    372 |
+------------+--------+
Copy

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;
Copy

Saída:

+-------+---------+---------------+
| STATE |   CITY  | GROSS REVENUE |
+=======+=========+===============+
|   CA  | SF      |            22 |
+-------+---------+---------------+
|   CA  | SJ      |            44 |
+-------+---------+---------------+
|   FL  | Miami   |            80 |
+-------+---------+---------------+
|   FL  | Orlando |           160 |
+-------+---------+---------------+
|   PR  | SJ      |           320 |
+-------+---------+---------------+
Copy

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 ...
Copy

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');
Copy

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                    |
+-------------+-----------------------------+
Copy

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 |
+-------------+--------+
Copy