Curso
Criar relatórios a partir de um conjunto de dados é uma habilidade essencial para quem trabalha com dados. No fim das contas, você quer responder a perguntas críticas de negócio com os dados que tem em mãos. Muitas vezes, essas respostas aparecem em gráficos; mas em outras, relatórios em forma de tabelas também são necessários. Em ambos os casos, pode ser preciso resumir os dados com cálculos simples. Em SQL, você faz esses resumos/agregações usando as funções de agregação. Com elas, você consegue responder perguntas como:
- Qual é o valor máximo de
some_column_from_the_table? ou - Quais são os valores mínimos de
some_column_from_the_tableem relação aanother_column_from_the_table?
e muitas outras.
Vamos começar a fazer algumas agregações de dados.
Observação: para acompanhar este tutorial, você precisa saber escrever consultas básicas em PostgreSQL (que será o SGBD usado). Este tutorial pode servir como um bom lembrete.
Preparando o banco de dados
Primeiro, vamos configurar um banco PostgreSQL e restaurar este backup, que contém a tabela usada neste tutorial. Se você quiser aprender a restaurar um backup no PostgreSQL, siga a primeira seção deste tutorial.
Se você conseguiu restaurar o backup, deverá ver uma tabela chamada international_debt no banco (você vai precisar criar um banco antes, caso ainda não tenha). Vamos dar uma olhada rápida nas primeiras linhas da tabela (uma consulta select simples resolve):

A tabela traz informações sobre estatísticas de dívida de diferentes países ao redor do mundo para o ano atual, em várias categorias (veja as colunas indicator_name e indicator_code). A coluna debt mostra o valor da dívida (em USD) que um país tem em uma categoria específica. Esses dados são da área de economia e são usados para analisar as condições econômicas de diferentes países. Os dados foram coletados pelo Banco Mundial.
Agora que o banco está pronto, vamos rodar algumas consultas simples para entender melhor os dados. Abra o pgAdmin e mãos à obra.
Informação simples importa
Pela figura acima, dá para ver que existem várias entradas repetidas para um mesmo país, mas em categorias diferentes. Uma pergunta que surge rapidamente é:
Quais são os diferentes países que a tabela registra?
Se você simplesmente rodar um select da coluna country_name, não terá a resposta certa, pois o resultado trará duplicados. Vamos usar a palavra-chave DISTINCT para resolver isso.
select distinct country_name from international_debt;
E isso deve retornar algo assim:

Agora você tem uma resposta razoável para a pergunta acima. E mais uma, antes de entrar nas funções de agregação:
Quantos tipos diferentes de indicadores de dívida existem na tabela?
A consulta para responder é semelhante à anterior. Basta trocar o nome da coluna. Que tal como exercício? O resultado deve ser parecido com o seguinte:

Funções de agregação
Vamos começar rodando uma consulta com uma função de agregação e avançar a partir daí. No caminho, você aprende mais sobre a sintaxe e os padrões que precisa seguir ao aplicar funções de agregação em SQL.
select sum(debt) from international_debt;
E o resultado:

Com a função de agregação SUM(), você calcula a soma aritmética de uma coluna numérica. Com a consulta acima, você obteve o total de dívida pendente dos países listados na tabela.
Importante: SUM() não considera valores NULL no cálculo. Agora vamos responder à pergunta:
Qual é o maior valor de dívida?
Aqui entra a função de agregação MAX() para te salvar:
select max(debt) from international_debt;
E a resposta é:

Assim como SUM(), MAX() não considera entradas NULL no cálculo. Existe também a função MIN(). Que tal me contar o valor mínimo da coluna debt na seção de Comentários? Agora é uma boa verificar se há alguma entrada inválida na coluna debt para garantir que os resultados estejam corretos até aqui.
Observação: use essas funções em minúsculas, como mostrado acima.
Ao executar esta consulta: select * from international_debt where debt is null;, você deve obter um resultado vazio. Agora vamos descobrir o número total de países distintos presentes na tabela.
select count(distinct(country_name)) from international_debt;
E você vê que há um total de 124 países distintos na tabela. Repare bem na combinação de funções usada acima. Sim, é permitido encadear mais de uma função de agregação de forma lógica.
Agora, suponha que você queira ver o valor médio da coluna debt. A função é AVG():
select avg(debt) from international_debt;
Você verá o valor 1306633214.966397971 (USD). É uma boa prática apresentar esses resultados com nomes de coluna adequados. Pelos resultados acima, dá para ver que o PostgreSQL usa o nome da função de agregação como nome da coluna no retorno. Então, vale a pena dar um alias apropriado a essas colunas. Por exemplo:
select avg(debt) as Average_Debt_By_A_Country from international_debt;
O resultado fica bem mais fácil de interpretar:

Vamos deixar um pouco mais complexo. Para responder perguntas como Quais são os valores mínimos de some_column_from_the_table em relação a another_column_from_the_table?, você precisa combinar uma função de agregação com a cláusula GROUP BY. Vamos ver como.
Funções de agregação + GROUP BY + mais
Suponha que você precise produzir um relatório mostrando o country_name e a soma de suas dívidas. Um exemplo:

Relatórios assim são muito comuns no dia a dia. Qual seria a consulta para obter algo assim? Você terá que usar SUM() em debt. E também precisa exibir o country_name junto com a soma das dívidas. Vamos executar:
select country_name, sum(debt) from international_debt;
Não aparece o seguinte erro?
ERROR: column "international_debt.country_name" must appear in the GROUP BY clause or be used in an aggregate function
Vamos entender o que isso significa. Quando você usa uma função de agregação (como SUM()) junto com uma coluna não agregada, como country_name, é preciso passar essa coluna para a cláusula GROUP BY. A consulta correta é:
select country_name, sum(debt) as total_debt from international_debt group by country_name;
E o resultado fica certinho:

Note o uso de alias na consulta.
Agora, suponha que você precise ordenar esse relatório pelo total_debt de forma decrescente. Lembra da cláusula ORDER BY? Sim, você também pode combiná-la com funções de agregação:
select country_name, sum(debt) as total_debt from international_debt
group by country_name order by total_debt desc;
O resultado agora deve estar invertido:

Observação a coluna usada na cláusula ORDER BY.
Agora outra pergunta importante:
Qual é o maior valor de dívida entre as diferentes categorias (em ordem decrescente)?
Aqui você vai precisar de MAX(). Escrever a consulta para responder a isso não deve ser difícil agora.
select indicator_code, max(debt) as maximum_debt from international_debt
group by indicator_code order by maximum_debt desc;
E você obtém um relatório limpo:

Você também pode limitar o número de linhas em relatórios assim. Digamos que você queira apenas as cinco primeiras entradas do relatório acima. É só usar a cláusula LIMIT.
select indicator_code, max(debt) as maximum_debt from international_debt
group by indicator_code order by maximum_debt desc
limit 5;
Hora do relatório final deste tutorial. Você precisa incluir os nomes dos países no relatório acima. Como fazer? A consulta a seguir resolve:
select country_name, indicator_code, max(debt) as maximum_debt from international_debt
group by country_name, indicator_code order by maximum_debt desc;
Mais um bom relatório:

Na consulta acima, você adicionou a coluna country_name após o SELECT e também no GROUP BY. Você pode estender esse formato para quantas colunas precisar.
A ordem de GROUP BY, ORDER BY e LIMIT é muito importante ao gerar relatórios desse tipo. Se você trocar a ordem por engano, vai encarar erros. Veja só:
select country_name, sum(debt) as total_debt from international_debt
order by total_debt desc group by country_name;
E você recebe:
ERROR: syntax error at or near "group"
LINE 1: ... from international_debt order by total_debt desc group by c...
Na consulta acima, você colocou ORDER BY antes de GROUP BY, o que não é permitido. Na verdade, isso também não se aplica quando você não está usando funções de agregação. A ordem correta é: GROUP BY -> ORDER BY -> LIMIT. Guarde isso.
Próximos passos
Parabéns! Você chegou ao fim deste tutorial. Aqui você conheceu diferentes funções de agregação no PostgreSQL e como usá-las para gerar relatórios úteis. Essas são habilidades fundamentais para qualquer cientista de dados. Para levar suas habilidades em SQL para o próximo nível de forma estruturada, confira estes cursos da DataCamp: