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 |
id | nome |
1 | Infantil |
2 | Informatica |
3 | Educacional |
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 |
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 |
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 |
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 |
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 |
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