Artigos de Tecnologia e Negócios > Data Science

Funções de agregação com GROUP BY no SQL, como utiliza-las ?

Alex Felipe
Alex Felipe

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!

Artigos de Tecnologia e Negócios > Data Science