artigo sql magazine 48 - Desvendando a cláusula GROUP BY – Parte 2

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Daremos continuidade neste artigo ao estudo sobre a cláusula Group By. Focaremos nesta matéria usos mais avançados deste recurso da SQL.

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

 

SQL

Desvendando a cláusula GROUP BY – Parte 2

 

Daremos continuidade neste artigo ao estudo sobre a cláusula Group By. Focaremos nesta matéria usos mais avançados deste recurso da SQL.

Agrupamento através de WITH ROLLUP

A cláusula GROUP BY possui muitas facilidades para agrupar e calcular informações agregadas, tais como o número total das penalidades ou a soma de todas as penalidades. Entretanto, até o que vimos na primeira parte desta matéria, todos os relatórios retornam resultados nos quais todas as informações estão no mesmo nível de agregação. Mas e se nós quisermos ver as informações pertencentes aos diferentes níveis de agregação contidos dentro de um relatório? Imagine que nós queremos ver, em um relatório, valor total das penalidades para cada jogador e, também, o valor total das penalidades para todos os jogadores. Isto não é possível com os formulários das cláusulas de GROUP BY que nós discutimos até aqui. Para esta finalidade, mais de dois agrupamentos dentro de uma cláusula de GROUP BY são requeridos. Adicionando a especificação WITH ROLLUP à cláusula de GROUP BY, isto se torna possível.

 

Exemplo 1. Para cada jogado, descubra a soma de todas as suas penalidades mais a soma de todas as penalidades.

Uma maneira de combinar esses dois agrupamentos em um relatório é usar o operador UNION (ver Listagem 1).

 

Listagem 1. Consulta do exemplo 1.

SELECT   PLAYERNO, SUM(AMOUNT)

FROM     PENALTIES

GROUP BY PLAYERNO

UNION

SELECT   CAST(NULL AS SIGNED INTEGER), SUM(AMOUNT)

FROM     PENALTIES

 

Para a consulta da Listagem 1 temos o resultado apresentado na Listagem 2.

 

Listagem 2. Resultado intermediário para a consulta do exemplo 1.

PLAYERNO  SUM(AMOUNT)

--------  -----------

       6       100.00

       8        25.00

      27       175.00

      44       130.00

     104        50.00

       ?       480.00

 

Explicação: As linhas neste resultado intermediário, no qual a coluna PLAYERNO é preenchida, formam o resultado do primeiro bloco select. As linhas nas quais PLAYERNO é igual a NULL compõem o resultado do segundo bloco select. As primeiras cinco linhas contêm informações sobre o nível de agregação dos números dos jogadores e a última linha, contém dados sobre o nível de agregação de todas as linhas.

A especificação WITH ROLLUP foi introduzida para simplificar este tipo de relatório. WITH ROLLUP pode ser usado para requerer múltiplos agrupamentos com uma única cláusula de GROUP BY. Neste caso, podemos obter o mesmo resultado com a consulta:

 

SELECT   PLAYERNO, SUM(AMOUNT)

FROM     PENALTIES

GROUP BY PLAYERNO WITH ROLLUP

 

Explicação: O resultado deste relatório é o mesmo que o do anterior. A especificação WITH ROLLUP indica que, depois do resultado ser agrupado com [PLAYERNO], outro agrupamento se faz necessário - neste caso, em todas as linhas.

Vamos analisar uma explicação mais formal. Imagine que numa cláusula GROUP BY as expressões E1, E2, E3 e E4 são especificadas. O agrupando executado é [E1, E2, E3, E4]. Quando nós adicionarmos a especificação WITH ROLLUP a este GROUP BY, todo um conjunto de agrupamentos será executado: [E1, E2, E3, E4], [E1, E2, E3], [E1, E2], [E1] e, finalmente, []. A especificação [] significa que todas as linhas estão agrupadas em um grupo. O agrupamento especificado é visto como o nível mais elevado de agregação que é pedido e também indica que todos os níveis mais elevados de agregação devem ser calculados outra vez. Agregar para cima é chamado rollup na literatura. Assim, o resultado deste relatório contém informações em cinco níveis diferentes de agregação.

 

Exemplo 2. Para cada combinação de sexo-cidade, obtenha o número de jogadores, obtenha o número total de jogadores por sexo e o número total de jogadores em toda a tabela:

 

SELECT   SEX, TOWN, COUNT(*)

FROM     PLAYERS

GROUP BY SEX, TOWN WITH ROLLUP

Para esta consulta, temos o resultado apresentado na Listagem 3.

Listagem 3. Resultado para a consulta do exemplo 2.

  SEX  TOWN       COUNT(*)

  ---  ---------  --------

1: M    Stratford         7

2: M    Inglewood         1

3: M    Douglas           1

4: M    ?                 9

5: V    Midhurst          1

6: V    Inglewood         1

7: V    Plymouth          1

8: V    Eltham            2

9: V    ?                 5

10:?    ?                14

 

Explicação: Este resultado possui três níveis de agregação. As linhas 1, 2, 3, 5, 6, 7 e 8 formam o nível mais baixo e foram adicionadas por causa do agrupamento [SEXO, CIDADE]; as linhas 4 e 9 foram adicionadas por causa do agrupamento [SEXO]; e a última linha forma o nível mais elevado de agregação e foi adicionada por causa do agrupamento []. Ele contém o número total dos jogadores.

Agrupamento utilizando WITH CUBE

Outra maneira de se obter múltiplos agrupamentos contidos numa cláusula GROUP BY é utilizar a especificação WITH CUBE.

Novamente, utilizaremos uma maneira mais formal para explicar esta nova especificação. Imagine que a especificação WITH CUBE é adicionada a uma cláusula GROUP BY que possui as expressões E1, E2 e E3. Como resultado, diversos agrupamentos são executados: [E1, E2, E3], [E1, E2], [E1, E3], [E2, E3], [E1], [E2], [E3] e, finalmente, []. A lista tem início com um agrupamento em todas as três expressões, seguido por três agrupamentos com duas expressões cada (um agrupamento para cada combinação possível de duas expressões) e seguido por um agrupamento para cada expressão separadamente; ele encerra com um agrupamento de todas as linhas.

 

Exemplo 3. Agrupe a tabela PLAYERS nas colunas SEX com TOWN e adicione uma especificação WITH CUBE (ver Listagem 4).

"

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?