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. 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 CUBE , GROUP BY GROUPING SETS , GROUP BY ROLLUP

Sintaxe

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

Onde:

GROUP BY groupItem [ , groupItem [ , ... ] ]

Especifica os aliases de coluna, posições ou expressões a serem usadas para agrupamento. Para cada groupItem, use a seguinte sintaxe:

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

Onde:

  • column_alias especifica o alias de coluna que aparece na lista SELECT do bloco de consulta.

  • position especifica a posição de uma expressão na lista SELECT.

  • expr especifica qualquer expressão em tabelas no escopo atual.

GROUP BY ALL

Especifica 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 Demonstrar precedência quando um nome de coluna e um alias forem correspondentes.

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

    A instrução acima equivale a não especificar o GROUP por cláusula:

    SELECT SUM(amount)
      FROM mytable;
    
    Copy

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

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