ROLLUP é uma função que permite uma instrução Select calcule vários níveis de subtotais através de um grupo especificado (Função que totaliza a função de Group). Está função calcula também um total geral. Rollup é uma extensão simples para a cláusula Group by, sua sintaxe é extremamente fácil de usar. Não podemos esquecer-nos de pensar em eficiência, a função é altamente eficiente, acrescentando sobrecarga mínima para uma consulta.
Quando usar o Rollup?
Usa a Função Rollup em SQL que envolvem subtotais. É muito útil para totalizar datas, cadastros e suas movimentações, entre outros.
Rollup Syntax
SELECT Campo01, Campo02, sum(Campo03)
FROM TableName
GROUP BY ROLLUP(Campo01, Campo02)
Abaixo iremos explicar como faremos e como identificar que precisaremos utilizar a função, pois muitas vezes deixamos esta função para o relatório ou mesmo para a tela do programa.
Exemplo:
Tenho uma tabela e preciso que a mesma me traga o total de pesagens por data e bloco totalizando a quantidade de peso. Antes da dica faria um select unia com outro select conforme o exemplo abaixo.
SELECT *
FROM
(
SELECT DT_MOV, COD_BLOCO, SUM(PESO_BRUTO - PESO_TARA) PESO
FROM OS_PESAGENS
WHERE COD_EMPRESA = 1
AND SAFRA = 2011
GROUP BY DT_MOV, COD_BLOCO
UNION
SELECT DT_MOV, 99999999 COD_BLOCO, SUM(PESO_BRUTO - PESO_TARA) PESO
FROM OS_PESAGENS
WHERE COD_EMPRESA = 1
AND SAFRA = 2011
GROUP BY DT_MOV
)
ORDER BY DT_MOV, COD_BLOCO
Resultado:
DT_MOV | BLOCO | PESO |
---|---|---|
27/04/2011 | 138010 | 883140 |
27/04/2011 | 303010 | 1151420 |
27/04/2011 | 314050 | 896300 |
27/04/2011 | 333010 | 1170580 |
27/04/2011 | 516010 | 532740 |
27/04/2011 | 539010 | 241540 |
27/04/2011 | 541020 | 1086940 |
27/04/2011 | 99999999 | 5962660 |
Abaixo está o exemplo com a Função Rollup, o SQL fica mais simples e mais eficiente.
SELECT DT_MOV, COD_BLOCO, SUM(PESO_BRUTO - PESO_TARA) PESO
FROM OS_PESAGENS
WHERE COD_EMPRESA = 1
AND SAFRA = 2011
GROUP BY ROLLUP(DT_MOV, COD_BLOCO)
Resultado:
DATA | BLOCO | PESO |
---|---|---|
27/04/2011 | 138010 | 883140 |
27/04/2011 | 303010 | 1151420 |
27/04/2011 | 314050 | 896300 |
27/04/2011 | 333010 | 1170580 |
27/04/2011 | 516010 | 532740 |
27/04/2011 | 539010 | 241540 |
27/04/2011 | 541020 | 1086940 |
27/04/2011 | 5962660 | |
28/04/2011 | 110010 | 306800 |
28/04/2011 | 138010 | 707740 |
28/04/2011 | 138020 | 499040 |
28/04/2011 | 303010 | 1560970 |
28/04/2011 | 314050 | 1179980 |
28/04/2011 | 333010 | 1550740 |
28/04/2011 | 516010 | 1192800 |
28/04/2011 | 539010 | 876160 |
28/04/2011 | 7874230 |
Neste exemplo apresentamos a Função Rollup com apenas 2 níveis, agora iremos aumentar um nível, pois ainda não temos um total geral, apenas subtotais.
SELECT COD_EMPRESA, DT_MOV, COD_BLOCO, SUM(PESO_BRUTO - PESO_TARA) PESO
FROM OS_PESAGENS
WHERE COD_EMPRESA = 1
AND SAFRA = 2011
GROUP BY COD_EMPRESA, ROLLUP(DT_MOV, COD_BLOCO)
Resultado:
EMP | DT_MOV | COD_BLOCO | PESO |
---|---|---|---|
1 | 27/04/2011 | 138010 | 883140 |
1 | 27/04/2011 | 303010 | 1151420 |
1 | 27/04/2011 | 314050 | 896300 |
1 | 27/04/2011 | 333010 | 1170580 |
1 | 27/04/2011 | 516010 | 532740 |
1 | 27/04/2011 | 539010 | 241540 |
1 | 27/04/2011 | 541020 | 1086940 |
1 | 27/04/2011 | 5962660 | |
1 | 28/04/2011 | 110010 | 306800 |
1 | 28/04/2011 | 138010 | 707740 |
1 | 28/04/2011 | 138020 | 499040 |
1 | 28/04/2011 | 303010 | 1560970 |
1 | 28/04/2011 | 314050 | 1179980 |
1 | 28/04/2011 | 333010 | 1550740 |
1 | 28/04/2011 | 516010 | 1192800 |
1 | 28/04/2011 | 539010 | 876160 |
1 | 28/04/2011 | 7874230 | |
1 | 3349829620 |
Concluímos que a função ROLLUP, é fácil de usar, altamente eficiente e com sobrecarga mínima para um consulta, não esquecendo que quando usarmos Group by não há necessidade de usar Order by (Tunning).
Obrigada.
Até o Próximo Artigo.
Rejane.