TÓPICO 5 – FUNÇÕES AGREGADAS

  • Subtópico 5.1 – Identificar as funções de agrupamento
  • Subtópico 5.2 – Descrever o uso das funções de agrupamento
  • Subtópico 5.3 – Agrupar dados usando a cláusula GROUP BY
  • Subtópico 5.4 – Incluir/excluir linhas agrupadas usando a cláusula HAVING

Neste quinto tópico referente a certificação de SQL Básico, falarei sobre as funções agregadas, como, quando e onde usa-las.

Antes de entrar de fato no assunto “Funções agregadas” vou mencionar algumas dicas que podem ser úteis no exame:

DICA.01 – É possível usar funções escalares dentro de funções agregadas. Por funções escalares entende-se que são funções que retornam apenas um valor, como TO_NUMBER e TO_CHAR. Ex:

DICA.03 – A clausula WHERE não pode ter funções agregadas. Mas pode ter funções escalares. Ex:

DICA.04 – O HAVING permite o uso de subqueries. Mais adiante falarei sobre o HAVING

DICA.05 – Com exceção do COUNT(*), Funções agregadas ignoram valores NULL.

1) FUNÇÕES AGREGADAS MAIS COMUNS

1.1) COUNT(E1)

Determina o número de ocorrências de valores não-nulos. Caso o valor da expressão E1 seja NULL, este não será contabilizado pelo COUNT. Quando se usa COUNT(*), é retornado o número de linhas da tabela (Caso uma tabela possua 5 linhas, mas todas com valores NULL, o COUNT(*) retornará 5). Quando se usa COUNT(NOME_COLUNA), é retornado o número de valores não-nulos dessa coluna.

OBS: Pode-se usar as palavras DISTINCT e ALL com o COUNT. Ex:

1.2) SUM(E1)

Realiza uma soma dos valores de uma coluna numérica. Ex:

1.3) MAX(E1) E MIN(E1)

Retorna, respectivamente o maior e o menor valor da coluna definida em E1. Ex:

OBS1: Tanto o MIN quanto o MAX trabalham com tipos de dados numéricos, de data e caracteres.

OBS2: Uma atenção especial deve ser dada ao usar MIN/MAX com caracteres. A definição funciona da seguinte forma:

‘A’ é menor que ‘Z’;
‘Z’ é menos que ‘a’;
a string ‘2’ é maior que a string ‘100’

… ou seja, as letras maiusculas representam um “valor menor” que as letras minusculas. Ex:

1.4) AVG(E1)

Retorna a média dos valores definidos na coluna E1. Trabalha apenas com dados numéricos. Também ignora valores NULL. Ex:

OBS1: Pode-se usar as palavras DISTINCT e ALL com o AVG. O funcionamento é o mesmo do COUNT.

1.5) MEDIAN(E1)

Opera com tipos numéricos e de data, ignorando valores NULL. Retorna o valor que esta “no meio” de uma lista, ou seja a mediana. Por mediana, entende-se:

“mediana é uma medida de tendência central, um número que caracteriza as observações de uma determinada variável de tal forma que este número (a mediana) de um grupo de dados ordenados separa a metade inferior da amostra, população ou distribuição de probabilidade, da metade superior. Mais concretamente, 1/2 da população terá valores inferiores ou iguais à mediana e 1/2 da população terá valores superiores ou iguais à mediana.”
– fonte: Wikipedia

1.6) RANK(C1) WITHIN GROUP (ORDER BY E1)

Os tipos de dados de C1 e E1 devem ser iguais. Essa função calcula o rank de um valor dentro de um grupo de valores. C1 é uma constante. A meu ver essa função é mais útil quando usada como função analítica. Ex:

1.7) DENSE_RANK

Calcula o rank de uma linha dentro de um grupo de linhas, ou seja, retorna a posição (rank) dessa linha dentro do grupo de linhas especificado pela query. Ex:

OBS1: A diferença entre o RANK e o DENSE_RANK é que o primeiro, ao detectar ranks repetidos, pula posições e o segundo, mantem o rank contínuo. Ex:

1.8) WM_CONCAT

Agrupa diversos valores de uma coluna em uma linha, separando as informações por vírgula. Ex:

1.9) ROLLUP

É uma subclausula do GROUP BY que agrega dados agregados na saida de um SELECT. A saída é chamada de linhas superagregadas. Ele se beneficia melhor ao trabalhar com a função SUM, mas pode trabalhar com outras também. Ele pode ser usado para adicionar subtotais e totais para os grupos de linhas da query.

OBS1: Para cada N grupos, ROLLUP produz N + 1 agrupamentos.

Exemplo:

1.10) CUBE

É uma versão tridimensional do ROLLUP, pois calcula subtotais para cada agrupamento possível das colunas selecionadas e agrupadas. Ele produz 2n possíveis superagregações, se n colunas forem especificadas no GROUP BY.

Tanto o CUBE quanto o ROLLUP são maneiras eficiêntes de calcular totais e subtotais em um único SQL. A diferença entre o ROLLUP e o CUBE é que o ROLLUP executa um número limitado de calculos de subtotais, já o CUBE executa todas as combinações possíveis, incluíndo um grande total.

Exemplo:

1.11) GROUPING

O GROUPING identifica linhas superagregadas ou agregadas produzidas pelo ROLLUP/CUBE. Só é válido em uma clausula SELECT que use o GROUP BY

Quando se usar o GROUPING sem as funções ROLLUP/CUBE, ele sempre retornará 0

O GROUPING atribui 1 para as linhas superagregadas (produzidas pelo ROLLUP/CUBE) e 0 para as linhas agregadas. Ex:

2) HAVING

Restringe os grupos identificados no GROUP BY. Cada linha retornada pela query, usando o GROUP BY representa um agrupamento de dados. O HAVING pode ser usado para filtrar esse agrupamento de dados. Creio que para entender melhor, basta testar e ver exemplos:

OBS1: O ORDER BY deve necessariamente vir por último na query.

OBS2: É possível usar o WHERE e o HAVING na mesma QUERY. O WHERE
 filtra as linhas antes de serem agrupadas, já o HAVING as filtra 
 após o agrupamento.

É isso por enquanto pessoal. Até a próxima oportunidade. Keep Querying.