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

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

Compartilhe

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!

Alex Felipe Victor Vieira
Alex Felipe Victor Vieira

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Criador de mais de 40 cursos, como Kotlin, Flutter, Android, persistência de dados, comunicação com Web API, personalização de telas, testes automatizados, arquitetura de Apps e Firebase. É expert em Programação Orientada a Objetos, visando sempre compartilhar as boas práticas e tendências do mercado de desenvolvimento de software. Atuou 2 anos como editor de conteúdo no blog da Alura e hoje ainda escreve artigos técnicos.

Veja outros artigos sobre Data Science