quinta-feira, 29 de setembro de 2016

Group By - Agrupar registros

Olá!

O comando Group By tem o objetivo de realizar o agrupamento dos registros de uma consulta, sendo que primeiramente é realizado a seleção dos registros da tabela e depois é aplicado o agrupamento no resultado da consulta.

Sintaxe: GROUP BY campo(s)_presentes_no_select

Note que os campos mencionados no GROUP BY são todos os campos presentes no SELECT.

Tabela para os exemplos:
PESSOA
CD_PESSOANOMESOBRENOMEIDADE
1FelipeBarbosa23
2AnaVieira20
3JoãoBarbosa19
4AlineBarbosa21
5MairaFerreira25
6AnaHavana19
7AlineFerreira22

Exemplo de consulta com o Group By:
  SELECT NOME
    FROM PESSOA
   WHERE IDADE > 18
GROUP BY NOME;

Resultado:
Resposta da execução do SQL
1º aplicação do Where2º aplicação do Group By
FelipeFelipe
AnaAna
JoãoJoão
AlineAline
MairaMaira
Ana
Aline

Como o agrupamento é realizado na resposta da consulta, repare que as linhas que possuem o mesmo valor não são apresentadas em registros diferentes, e isso não significa que elas foram descartadas. O que acontece é que foram agrupadas em um único registro.

Outro exemplo de consulta com o Group By:
  SELECT NOME
       , SOBRENOME
    FROM PESSOA
   WHERE IDADE > 18
GROUP BY NOME
       , SOBRENOME;

Resultado:
Resposta da execução do SQL
NOMESOBRENOME
FelipeBarbosa
JoãoBarbosa
AlineBarbosa
AnaVieira
MairaFerreira
AlineFerreira
AnaHavana

OK! Mas para o primeiro exemplo, poderíamos ter utilizado o Distinct, e para o segundo exemplo o Order By?

Sim, o resultado visual seria o mesmo. Entretanto, com Distinct os registros que possuem o mesmo valor são desprezados totalmente, e com o Order By os registros seriam agrupados somente em efeito visual. 

Assim, é necessário avaliar o objetivo da consulta, pois na maioria das vezes o Group By é utilizado quando ocorre o questionamento de quantidade sobre um determinado grupo de informações, ou a necessidade de utilizar uma função agregada.

Exemplo: Quantos nomes cada sobrenome possui, ou seja, quantos nomes há cadastrados para o sobrenome Barbosa, Vieira, Ferreira e Havana? Para responder essa questão, é necessário elaborar um SQL agrupado pelo sobrenome e uma função para realizar a contagem (Count( ) no próximo post).

Então, podemos dizer que o SQL que contém o comando Group By tem dois passos de execução, o primeiro é agrupar os registros em conjuntos, e o segundo é agrupar os registros desses conjuntos que possuem valores iguais em um único registro, veja o fluxo abaixo para o questionamento anterior sobre a quantidade de nomes para cada sobrenome:

Fluxo da execução do SQL
1º passo de execução2º passo de execuçãoResultado Final
SOBRENOMEContadorSOBRENOMEContadorSOBRENOMEContador
Barbosa1Barbosa1 + 1 + 1Barbosa3
Barbosa1  Barbosa1Vieira1
Barbosa1  Barbosa1Ferreira2
Vieira1Vieira1Havana1
Ferreira1Ferreira1 + 1
Ferreira1  Ferreira1
Havana1Havana1

Note que no primeiro passo de execução os registros são agrupados em conjuntos, e no segundo passo de execução os registros que possuem o mesmo valor são agrupados em uma linha. O resultado final indica que temos 3 nomes para o sobrenome Barbosa, 2 nomes para o sobrenome Ferreira, 1 nome para o sobrenome Vieira e Havana.

Consultar a relação de Termos e Abreviaturas acesse aqui.
Felipe Barbosa Ferreira
Até o próximo post!

Nenhum comentário:

Postar um comentário