Agregando valores na base de doações para campanhas eleitorais

Quantas doações e quantos reais cada partido recebeu? Para responder a esse tipo de questão, vamos estudar agora as funções agregadoras e o agrupamento (GROUP BY).

No comando SELECT, no lugar dos campos selecionados, podemos utilizar também funções que operam sobre esses campos. Um exemplo simples:

SELECT max(Valor), SiglaPartido, NomeDoador FROM doacoes;
4750000, PT, JBS S/A

Veja que em vez de mostrar o campo Valor de todos os registros, agora a gente vê apenas o registro com o maior valor existente. Para ver a menor doação, também é fácil:

SELECT min(Valor), SiglaPartido, NomeDoador FROM doacoes;
0.34, PSTU, EUZILENE TEODOZIA RODRIGUES RIBEIRO

Dizemos que min e max são funções. Existem outras, como a count, que nos retorna a quantidade de registros.

SELECT count(*) FROM doacoes;
1517

Isso vai mostrar a quantidade de registros da tabela. Que no caso é 1517.

Por que esse * no count?

A gente viu que o max e o min operam sobre colunas específicas, que são os argumentos das funções max e min. No exemplo do count, não faz sentido especificar uma coluna específica, então a gente usa o ‘*’.

Um exemplo interessante de count sem usar o * seria esse aqui que mostra a quantidade de partidos existentes na base:

SELECT count(distinct SiglaPartido) FROM doacoes;
30

Se refinarmos o critério de consulta, o count nos retornará um resultado mais específico:

SELECT count(*) FROM doacoes WHERE SiglaPartido = 'PMDB';
51

SELECT count(*) FROM doacoes WHERE SiglaPartido = 'PV';
20

As consultas acima mostraram as quantidade de doações para o PMDB e para o PV.

Mas… e se a gente quiser ver as quantidade de doações feitas para cada um dos partidos existentes na base? Vamos ter que ficar fazendo um SELECT para cada partido?! Claro que não! Para isso temos o GROUP BY, que agrega o resultado das funções em grupos. Novamente, mais fácil mostrar:

SELECT SiglaPartido, count(*) FROM doacoes GROUP BY SiglaPartido;

O resultado mostra as quantidades de doações recebidas por cada partido.

Pra ficar mais interessante:

SELECT SiglaPartido, count(*) AS quantidade FROM doacoes GROUP BY SiglaPartido ORDER BY quantidade DESC;

Essa consulta traz os mesmos registros que a consulta anterior, mas ordenando os resultados, de forma que a gente tenha no topo os partidos com mais doações recebidas. Para isso, introduzimos uma pequena novidade. Usamos a palavra-chave AS para batizar a coluna que exibe o valor do count com o nome de “quantidade”. Isso foi importante para que pudéssemos ordenar os resultados pela quantidade.

Mas mais interessante do que a quantidade de doações, é o valor total das doações recebidas por cada partido! Pra isso vamos usar a função sum:

SELECT SiglaPartido, sum(Valor) as total FROM doacoes ORDER BY total DESC GROUP BY SiglaPartido;

Pam!

O comando acima está errado! A ordem do ORDER BY e do GROUP BY estão invertidas!

Quando escrevemos um comando com uma estrutura inválida, o SQLite Manager irá nos avisar, mesmo que de forma não muito amigável. É como se ele estivesse nos xingando. Mas o importante, na mensagem de erro do SQLite Manager, é procurar pelo texto entre colchetes, que no caso é “near “GROUP”: syntax error”. É uma dica bem fria, mas ele está basicamente nos dizendo que até antes de “GROUP” as coisas iam bem, já que “SELECT SiglaPartido, sum(Valor) as total FROM doacoes ORDER BY total” é um comando válido. Aí temos que desconfiar do GROUP até sacar que o problema é a inversão da ordem.

Ah, o comando correto:

SELECT SiglaPartido, sum(Valor) as total FROM doacoes GROUP BY SiglaPartido ORDER BY total DESC;

O GROUP BY é uma das cláusulas mais interessantes para o jornalismo de dados, pois podemos gerar tabelas com informações agregadas que podem facilmente virar gráficos para serem publicados nas matérias.

No próximo post, outro recurso da SQL que nos trará bastante flexibilidade: as sub consultas.

Um comentário sobre “Agregando valores na base de doações para campanhas eleitorais

Deixe um comentário