GROUP BY é uma cláusula SQL que agrupa um conjunto de dados similares, podendo utilizar mais de um campo para realizar esta tarefa.

Visão geral

O agrupamento de dados é utilizado para exibir resultados de um conjunto comum de informações. Essa prática é muito utilizada em conjunto as funções agragadas, onde o cálculo é feito sobre um todo, mas a exibição é agrupada por uma coluna pré-determinada.

Para os exemplos a seguir, considere a estrutura de tabelas abaixo, onde temos uma tabela chamada produto (Tabela 1), responsável por armazenar todos os produtos do estoque do cliente, a tabela categoria_produto (Tabela 2), responsável por armazenar todas as categorias existentes no banco de dados, e a tabela venda_produto (Tabela 3), que relaciona os produtos que foram vendidos.

id nome preco Id_categoria
1 Bola 35.00 1
2 Patinete 120.00 1
3 Carrinho 15.00 1
4 Skate 296.00 1
5 Notebook 3500.00 2
6 Monitor LG 19 450.00 2
7 O Diário de Anne Frank 45.00 3
8 O dia do Curinga 65.00 3
9 O mundo de Sofia 48.00 3
10 Através do Espelho 38.00 3
Tabela 1. Tabela produto
id nome
1 Infantil
2 Informatica
3 Educacional
Tabela 2. Tabela categoria_produto
id id_produto valor data
1 1 35.00 2018-05-15
2 1 35.00 2018-06-15
3 1 35.00 2018-07-15
4 2 120.00 2018-07-15
5 2 120.00 2018-07-14
6 3 15.00 2018-07-15
7 7 45.00 2018-07-15
8 8 65.00 2018-07-15
9 8 65.00 2018-07-16
10 9 48.00 2018-07-16
11 5 3500.00 2018-07-16
12 5 3500.00 2018-07-16
13 6 450.00 2018-07-16
Tabela 3. Tabela venda_produto

Suponhamos que seja necessário trazer em uma consulta o total de produtos cadastrados na tabela produto, porém, é necessário saber exatamente quantos produtos estão cadastrados para cada categoria do banco de dados. Para isso, podemos utilizar o fragmento de código abaixo:

SELECT 
  COUNT(P.ID) AS TOTAL,
  C.nome as CATEGORIA
  FROM 
  produto P, categoria_produto C
  WHERE
  P.id_categoria = C.id
  GROUP BY
C.id

No trecho de código acima, nas linhas 1 a 3 selecionamos o total de ID produto, nomeado como TOTAL e o nome da categoria, nomeado de CATEGORIA.

Nas linhas 4 e 5 informamos que a consulta será realizada nas tabelasproduto, nomeada de P, e categoria_produto, nomeada de C.

Nas linhas 6 e 7 definimos como filtro da consulta o id de produto ser o mesmo nas duas tabelas, realizando assim o vínculo entre elas.

Nas linhas 8 e 9 agrupamos o resultado da consulta pelo ID da categoria, que é o item que desejamos agrupar.

O resultado da consulta pode ser visto na Tabela 4.

TOTAL CATEGORIA
4 infantil
2 Informatica
4 Educacional
Tabela 4. Resultado da busca de quantidade de produtos agrupados por categoria

Sintaxe

SELECT
  [ coluna1, coluna2, ... | * ]
  FROM
  [ tabela1, tabela2, ... ]
GROUP BY [ coluna1, coluna2, ... ]

Na prática

Exemplo 1

Suponha que seja necessário saber o total recebido por categoria com a venda dos produtos. Utilizaremos a tabela venda_produto (Tabela 3), responsável pela informação dos produtos vendidos. Para essa consulta podemos utilizar o trecho de código abaixo:

SELECT 
  SUM(VP.valor) AS TOTAL,
  C.nome as CATEGORIA
FROM 
  produto P, categoria_produto C, venda_produto VP
WHERE
  P.id_categoria = C.id AND
  VP.id_produto = P.id
GROUP BY
  C.id

Observe que no trecho de código acima, selecionamos a soma da coluna valor da tabela venda_produto, a categoria da tabela categoria_produto, e por fim agrupamos o resultado pelo ID da categoria. conforme podemos ver na Tabela 4.

TOTAL CATEGORIA
360.00 Infantil
7450.00 Informatica
223.00 Educacional
Tabela 4. Resultado da busca da soma de venda de produtos agrupados por categoria

Exemplo 2

Suponha que seja necessário saber o total recebido por dia com a venda de produtos. Utilizaremos a tabela venda_produto (Tabela 3), responsável pela informação dos produtos vendidos. Para essa consulta podemos utilizar o trecho de código abaixo:

SELECT 
  SUM(valor) as TOTAL,
    data
  FROM
    venda_produto
  GROUP BY 
  data;
  

No trecho de código acima, utilizamos a função SUM para realizar a soma da coluna valor da tabela venda_produto, e agrupamos todo o resultado pela data da venda, ou seja, a cada produto vendido em uma determinada data, o SQL irá somar o seu valor e informar o total e a data da venda, conforme ilustra o resultado na Tabela 5.

TOTAL DATA
35.00 2018-05-15
35.00 2018-06-15
120.00 2018-07-14
280.00 2018-07-15
7563.00 2018-07-16
Tabela 5. Resultado da busca de quantidade de produtos agrupados por categoria

Exemplo 3

Para este exemplo, aproveitaremos a consulta realizada no exemplo anterior, porém dessa vez será necessário trazer a soma do total de produtos e agrupar pelo mês da venda. Para isso podemos utilizar o trecho de código abaixo:

SELECT 
  SUM(valor) as TOTAL,
    MONTH(data) as MES
  FROM
    venda_produto
  GROUP BY 
    MES;

No trecho de código acima, utilizamos a função SUM para realizar a soma da coluna valor da tabela venda_produto, e agrupamos todo o resultado pelo Mês, conforme ilustra o resultado na Tabela 6.

TOTAL MES
35.00 5
35.00 6
7963.00 7
Tabela 6. Resultado da busca de quantidade de produtos agrupados por MES

Mais exemplos da utilização do GROUP BY podem ser vistas em FUNÇÕES AGREGADAS.

Saiba mais Veja a Série SQL nível Jedi: Subqueries