Esse artigo faz parte da revista SQL Magazine edição 55. Clique aqui para ler todos os artigos desta edição

servem apenas para armazenar dados.

Armazenar é um meio e não o fim. O fim é informar, em outras palavras, recuperar dados e tratá-los para conseguirmos informações relevantes.

Muitas vezes ficamos tão entretidos na coleta de dados que simplesmente não nos damos conta da importância da análise destes.

A linguagem SQL oferece uma série de recursos para sumarização de dados, entre eles as funções de agregação. Estas funções são a base de toda a análise de dados que fazemos usando a linguagem SQL.

 

Funções de Agregação X Bancos de Dados

Como dissemos no artigo sobre funções T-SQL (SQL Magazine 49), a linguagem SQL é usada em todos os principais bancos de dados relacionais disponíveis no mercado. Com ligeiras variações, a mesma sentença SQL é executada nos mais variados produtos, tais como SQL Server, Oracle, DB2, Firebird, MySQL, etc. Isso porque estes produtos respeitam um padrão internacional estabelecido, conhecido como ANSI SQL.

No que diz respeito às funções de agregação, as principais funções são suportadas em praticamente todos os bancos de dados relacionais. É verdade que alguns bancos de dados trazem funções complementares, que são extensões ao padrão ANSI SQL. Mas vamos nos concentrar nas funções padrão.

Nosso estudo foi desenvolvido usando o banco de dados Firebird 2.0.1 SuperServer, mas todas as sentenças listadas aqui são suportadas nos principais produtos concorrentes.

 

O banco de dados estudado

Para este trabalho, criamos no Firebird um banco de dados chamado “Farmaceutico”, que armazena informações de demanda de produtos farmacêuticos. O diagrama desta base é exibido na Figura 1.

 

Figura 1. Diagrama do banco de dados “Farmaceutico”

 

Na verdade, quem já leu algum dos meus artigos em números anteriores da SQL Magazine, perceberá que migramos esta base do SQL Server para o Firebird. Este é um processo simples, mas ele foge do nosso escopo. Portanto não vamos abordar este assunto no presente artigo.

 

Declarações SQL para agregação

Por simplificação, podemos pensar que as funções de agregação estão sempre associadas ao uso da cláusula GROUP BY.

Existe um cenário em que podemos usar estas funções sem a cláusula GROUP BY, mas é uma situação de exceção: quando desejamos ter uma métrica baseada em todos os registros da tabela. Por exemplo: o maior valor de um campo dentre todos os registros da tabela.

O cenário mais comum é usarmos funções de agregação para obtermos métricas (contagem, máximo, mínimo, média) para cada valor existente em um dos campos da tabela. E, neste caso, usaremos o GROUP BY.

A Listagem 1 mostra uma sentença SQL para retornar todos os produtos que tiveram alguma transação de demanda durante o ano de 2006. O GROUP BY foi usado para listarmos todos os nomes de produto, sem repetição.

 

Listagem 1. Produtos que tiveram demanda no ano de 2006

 

SELECT P.Produto

FROM tblDemanda T

         INNER JOIN tblProduto P ON T.fkProduto   = P.pkProduto

WHERE T.DATA BETWEEN '01/01/2006' AND '12/31/2006'

GROUP BY P.PRODUTO

ORDER BY 1;

 

Neste exemplo, o INNER JOIN foi usado para cruzar os dados de demanda (tblDemanda) com as descrições dos produtos (tblProduto). Esta junção é baseada na chave primária da tabela de produtos (pkProduto) e na chave estrangeira da tabela de demanda que faz referência aos produtos (veja novamente a Figura 1).

A cláusula ORDER BY apareceu apenas para listar os produtos em ordem alfabética.

Finalmente, o GROUP BY foi inserido para exibirmos informações agrupadas pelos diferentes produtos identificados. Ainda não usamos nenhuma função de agregação na Listagem 1, mas a declaração já está pronta para isso.

Vamos abrir um parêntese aqui. A Listagem 1 retorna apenas uma lista de produtos, mas existe uma outra maneira de obtermos o mesmo resultado. No caso, poderíamos dispensar a cláusula GROUP BY e incluir o operador DISTINCT, como vemos na Listagem 2.

 

Listagem 2. Produtos com demanda no ano de 2006, usando DISTINCT

 

SELECT DISTINCT P.Produto

FROM tblDemanda T

         INNER JOIN tblProduto P ON T.fkProduto   = P.pkProduto

WHERE T.DATA BETWEEN '01/01/2006' AND '12/31/2006'

ORDER BY 1;

 

Em geral, o desempenho de consultas usando o operador DISTINCT é melhor do que as declarações que usam a cláusula GROUP BY. Mas o operador DISTINCT é bom apenas para retornar uma lista de valores distintos. Ele não suporta funções de agregação.

 

Funções de agregação

Vamos estudar nesta seção as funções de agregação mais comuns e os argumentos suportados. A seguir, descrevemos cada função e apresentamos exemplos. Começamos com a função COUNT.

COUNT: Oferece a contagem de valores. Pode ser usada com qualquer tipo de dados, inclusive usando campos alfanuméricos. Aceita os seguintes argumentos:

·         COUNT(*): apresenta uma contagem simples de registros. Ou seja, representa o total geral de registros da tabela, incluindo valores nulos;

·         COUNT([ALL] Expressão): apresenta a contagem de registros onde o campo ou expressão em questão apresenta valores não nulos. Na verdade, a palavra-chave ALL é padrão e, portanto, pode ser omitida;

·         COUNT(DISTINCT Expressão): apresenta a contagem dos valores distintos do campo em questão.

 

Dizemos que o argumento das funções de agregação são expressões porque estes argumentos podem ser campos de tabelas ou mesmo expressões de cálculo.

Tais expressões podem ser calculadas com base em vários campos diferentes. A única restrição é que estas expressões de cálculo devem retornar um único valor (numérico ou alfanumérico) por cálculo. Nunca podemos considerar mais de um campo como argumento das funções. Estas noções são válidas para todas as funções de agregação da linguagem SQL.

Vamos ver agora um exemplo abordando a contagem por categoria de produtos que tiveram demanda no ano de 2006. A Listagem 3 apresenta uma declaração SQL que utiliza a função COUNT associada a cada um dos argumentos suportados. Os dados são agrupados por categoria de produtos e o indicador que estamos analisando é a contagem de bricks. Bricks são micro-regiões geográficas consideradas principalmente no mercado farmacêutico. ...

Quer ler esse conteúdo completo? Tenha acesso completo