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.