Ao trabalharmos com T-SQL, nos deparamos com diversas necessidades de totalizadores, o que é geralmente alcançado por meio do uso da cláusula GROUP BY em nossa consultas. O que alguns não sabem, e eu descobri isso recentemente, é que essa cláusula possui diversas extensões que vieram para facilitar nossa vida em diversas situações.
Neste post de hoje, vou tentar demonstrar de forma prática como utilizar a extensão ROLLUP, seus conceitos de uso e aplicabilidade.
O operador ROLLUP, é uma extensão da cláusula GROUP BY. Além dele, existem ainda o CUBE e GROUPING SETS, porém, para não perdermos o foco, neste post de hoje, veremos apenas o ROLLUP. Vamos falar no conjunto geral, onde convier a igualdade entre as extensões, para aproveitar os conceitos.
Eu particularmente, acho interessante focar em apenas um dos operadores, para simplificar ao máximo o aprendizado, mas em breve, falaremos mais dos outros operadores.
GROUP BY
Bom. Antes de falarmos especificamente do operador ROLLUP, relembramos como funciona a cláusula GROUP BY. Essa cláusula, como muitos sabem, geralmente trabalha em conjunto com funções de agregação, como por exemplo SUM(), MAX(), MIN() e etc. Tais funções de agregação, neste exemplo, são utilizadas para obter-se somatórios, valor máximo e mínimo, respectivamente. Mais restritamente a função SUM(), retornará o total da soma de um determinado campo da nossa tabela.
Ok. Até ai, já sabemos. Então vejamos. Imagine a seguinte tabela:
1 2 3 |
--------------------------------------------- | Aluno | Materia | Dia_Semana | --------------------------------------------- |
Eu fiz diversas inserções nesta tabela, listando Nome do aluno, nome da matéria e em qual dia, ele tem aula, por exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
--------------------------------------------- | Aluno | Materia | Dia_Semana | --------------------------------------------- | AlunoA | Matematica | Segunda | | AlunoA | Matematica | Quarta | | AlunoA | Matematica | Quinta | | AlunoA | Física | Quinta | | AlunoA | Portugues | Sexta | | AlunoA | Física | Sexta | | AlunoB | Matematica | Quarta | | AlunoB | Matematica | Quinta | | AlunoB | Física | Quinta | | AlunoB | Portugues | Quarta | | AlunoB | Física | Sexta | --------------------------------------------- |
Utilizando uma função de agregação, como por exemplo COUNT(), que retorna o número total de itens no agrupamento, teremos:
Consulta com GROUP BY simples:
1 2 3 |
select dia_semana, materia, COUNT(aluno)AS qtd from presenca group by materia, dia_semana |
O resultado será:
1 2 3 4 5 6 7 8 9 10 11 12 |
------------------------------------- | Aluno | Materia | Qtd | ------------------------------------- | Quarta | Física | 4 | | Quinta | Física | 6 | | Sexta | Física | 6 | | Quarta | Matematica | 6 | | Quinta | Matematica | 6 | | Segunda | Matematica | 1 | | Quarta | Portugues | 4 | | Sexta | Portugues | 6 | ------------------------------------- |
ROLLUP
Ao aplicarmos o operador ROLLUP, em nossa consulta anterior, teremos, além do total de alunos, por dia/matéria, teremos o total para cada grupo realizado, e ainda, um total geral da de todos os grupos, como mostrado a seguir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
------------------------------------- | Aluno | Materia | Qtd | ------------------------------------- | Quarta | Física | 4 | | Quinta | Física | 6 | | Sexta | Física | 6 | | NULL | Física | 16 | | Quarta | Matematica | 6 | | Quinta | Matematica | 6 | | Segunda | Matematica | 1 | | NULL | Matematica | 13 | | Quarta | Portugues | 4 | | Sexta | Portugues | 6 | | NULL | Portugues | 10 | | NULL | NULL | 39 | ------------------------------------- |
Observe as colunas com retorno NULL. Temos três colunas de totais para cada grupo, e uma última, de total de todos os grupos.
Como utilizar o operador ROLLUP
Este tutorial, foi desenvolvido com base em uma banco de dados MySQL. Abaixo veremos como utilizar o operador em banco de dados MySQL e SQL Server. Veja.
Como utilizar o operador ROLLUP no MySQL
No MySQL, o operador ROLLUP, é utilizado logo após a cláusula GROUP BY, em conjunto com a cláusula WITH, como mostrado a seguir.
OBS: O MySQL, quando utilizando o operador, ele não permite o uso do ORDER BY na consulta.
1 2 3 |
select dia_semana, materia, COUNT(aluno)AS qtd from presenca group by materia, dia_semana with rollup |
Como utilizar o operador ROLLUP no SQL Server
No SQL Server, diferentemente do MySQL, o operador é utilizando como uma função, passando-se os campos relacionados, ao operador, como mostrado a seguir, além de se poder utilizar a cláusula ORDER BY:
1 2 3 4 |
select dia_semana, materia, COUNT(aluno)AS qtd from presenca group by rollup (dia_semana, materia) order by dia_semana, materia |
No momento que estou escrevendo esse post, eu não estou com acesso ao banco de dados SQL server, mas deixo aqui, o link de referência.
https://technet.microsoft.com/pt-br/library/bb522495(v=sql.105).aspx
Bom, acredito que até aqui, já seja possível entender o funcionamento do operador. Em um próximo post, vamos falar um pouco mais dos demais operadores que citamos, que são os CUBE e GROUPING.
Fico por aqui. Um grande abraço. Até o próximo post.