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.