Funções de agregação com GROUP BY no SQL, como utiliza-las ?
Conhecer as funções pré definidas do SQL nos ajuda a ter mais produtividade no dia a dia,nesse artigo vou mostrar como utilizar funções de agregação com GROUP BY.
Eu criei uma tabela livros
e inseri todas as compras que realizei:
SELECT * FROM livros;
id: 1
nome: Plataforma Java EE
autor: Alberto Souza
valor: 39.90
data_compra: 2015-12-05
id: 2
nome: Google Android
autor: João Bosco Monteiro
valor: 25.90
data_compra: 2015-12-10
id: 3
nome: Spring MVC
autor: Alberto Souza
valor: 45.90
data_compra: 2015-12-10
id: 4
nome: A Web Mobile
autor: Sergio Lopes
valor: 26.90
data_compra: 2016-01-04
id: 5
nome: REST
autor: Alexandre Saudate
valor: 39.90
data_compra: 2015-01-12
id: 6
nome: SQL
autor: Eduardo Gonçalves
valor: 23.90
data_compra: 2015-12-05
Ótimo! Os livros que eu comprei estão bem organizados. Posso até fazer queries para verificar, por exemplo, quais foram os livros que eu paguei mais de R$ 30,00:
SELECT * FROM livros
WHERE valor > 30;
SELECT * FROM livros;
id: 1
nome: Plataforma Java EE
autor: Alberto Souza
valor: 39.90
data_compra: 2015-12-05
id: 3
nome: Spring MVC
autor: Alberto Souza
valor: 45.90
data_compra: 2015-12-10
id: 5
nome: REST
autor: Alexandre Saudate
valor: 39.90
data_compra: 2015-01-12
Porém, agora eu queria saber quanto gastei com todos os livros que paguei acima de R$ 30,00. Ou seja, quero fazer uma soma! Como podemos fazer isso no SQL? É muito simples: já existem funções pré-definidas pelos bancos de dados realizar cálculos. Podemos, por exemplo, usar a função SUM para somar:
SELECT SUM(valor) AS total
FROM livros WHERE valor > 30;
total | 125.70
Essas funções são chamadas de funções de agregação. Elas agrupam todas as linhas encontradas e retornam apenas uma única linha com o resultado da operação solicitada. Nesse caso, uma soma :)
Consegui verificar o quanto gastei com livros acima de R$ 30,00, mas agora eu preciso saber o quanto gastei por mês! Na minha tabela as datas são completas, ou seja: tem dia, mês e ano. Mas, nesse caso, preciso apenas do mês...como podemos retornar apenas o mesmo de uma data? Simples! Da mesma forma que o banco de dados forneceu uma função para somar, ele também fornece uma função para devolver o mês de uma data! Utilizamos o MONTH() que extrai o mês de uma determinada data:
SELECT nome, valor, MONTH(data_compra) AS mês FROM livros;
id: 1
nome: Plataforma Java EE
autor: Alberto Souza
valor: 39.90
mês: 12
id: 2
nome: Google Android
autor: João Bosco Monteiro
valor: 25.90
mês: 12
id: 3
nome: Spring MVC
autor: Alberto Souza
valor: 45.90
mês: 12
id: 4
nome: A Web Mobile
autor: Sergio Lopes
valor: 26.90
mês: 1
id: 5
nome: REST
autor: Alexandre Saudate
valor: 39.90
mês: 1
id: 6
nome: SQL
autor: Eduardo Gonçalves
valor: 23.90
mês: 12
Então, agora que sabemos como somar e como pegar o mês, basta juntar as duas funções! Vamos fazer nossa nova query:
SELECT SUM(valor) AS total, MONTH(data_compra) AS mês FROM livros;
total | 125.70
Ué, apenas mês 12? E R$ 202,40 apenas no mês 12? Eu tenho quase certeza que não foi tudo isso. Vamos filtrar essa query para retornar apenas os livros comprados no mês 12:
SELECT SUM(valor) AS total, MONTH(data_compra) AS mês FROM livros WHERE MONTH(data_compra) = 12;
total: 135.60
mês: 12
O que será que está acontecendo? Será que não podemos exibir mais de uma linha com uma função de agregação? Muito estranho isso. Como vimos, as funções de agregação a princípio retornam apenas uma única linha. O que precisamos fazer é informar que queremos agrupar as linhas por mês soma-las! Para isso, utilizaremos a instrução GROUP BY
informando qual coluna queremos que seja agrupada:
SELECT SUM(valor) AS total, MONTH(data_compra) AS mês
FROM livros
GROUP BY MONTH(data_compra);
total: 66.80
mês: 1
total: 135.60
mês: 12
Excelente, veja que agora conseguimos verificar quanto foi gasto por mês!
Vimos que quando utilizamos funções de agregação(como SUM()
) por padrão o branco nos retorna apenas uma única linha com o resultado de todas as linhas que foram encontradas. Mas, se quisermos que a função agrupe por diferente de uma outra coluna(como o mês), precisamos informar que essa coluna será agrupada utilizando a instrução GROUP BY
.
E aí, gostou da função SUM()
e o GROUP BY
? Está pronto para utilizá-la em seu banco de dados? O que acha aprender mais funções de agregação para criar queries mais robustas e inteligentes? Temos vários cursos de SQL na Alura para que você aprenda desde queries mais básicas até as mais complexas!