No MySQL 4.1.1, a cláusula GROUP BY
          permite um modificador WITH ROLLUP que faz
          com que uma linha extra seja adicionada à saida resumo. Estas
          linhas representam operações de resumo de nível mais alto
          (ou super agregadas). Assim, o ROLLUP
          permite que você responda questões em multiplos níveis de
          análise com uma única consulta. Ele pode ser usado, por
          exemplo, para fornecer suporte para operações OLAP (Online
          Analytical Processing - Processamento Analítico OnLine).
        
          Como ilustração, suponha que uma tabela chamada
          sales tenha as colunas
          year, country,
          product e profit para
          registrar as vendas lucrativas:
        
CREATE TABLE sales
(
    year    INT NOT NULL,
    country VARCHAR(20) NOT NULL,
    product VARCHAR(32) NOT NULL,
    profit  INT
);
          O conteúdo da tabela pode ser resumido pode ano com um
          simples GROUP BY como este:
        
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 |        4525 |
| 2001 |        3010 |
+------+-------------+
Esta saída mostra o lucro total para cada ano, mas se você também quiser determinar o lucro total somado em todos os anos, você deve adicionar os valores adicionais ou executar uma consulta adicional.
          Ou você pode usar o ROLLUP, que fornece os
          dois níveis de análise com uma única consulta. Adicionando
          um modificador WITH ROLLUP a cláusula
          GROUP BY faz com que a consulta produza
          outra linha que mostra o total geral de todos os anos:
        
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 |        4525 |
| 2001 |        3010 |
| NULL |        7535 |
+------+-------------+
          A linha de total super-agrupada é identificada pelo valor
          NULL na coluna year.
        
          ROLLUP tem um efeito mais complexo quando
          há múltiplas colunas GROUP BY. Neste
          caso, cada vez que houver um ``break'' (alteração no valor)
          em qualquer agrupamento, com exceção da última coluna, a
          consulta produz um linha resumo super-agrupada extra.
        
          Por exemplo, sem ROLLUP, um resumo na
          tabela sales baseada no
          year, country e
          product pode se parecer com isto:
        
mysql>SELECT year, country, product, SUM(profit)->FROM sales-> GROUP BY year, country, product; +------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2001 | Finland | Phone | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | +------+---------+------------+-------------+
          A saída indica os valores resumidos apenas no nível
          year/country/product da análise. Quando
          ROLLUP é adicionado, a consulta produz
          diversas linhas extras:
        
mysql>SELECT year, country, product, SUM(profit)->FROM sales->GROUP BY year, country, product WITH ROLLUP;+------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | India | NULL | 1350 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2000 | USA | NULL | 1575 | | 2000 | NULL | NULL | 4525 | | 2001 | Finland | Phone | 10 | | 2001 | Finland | NULL | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | | 2001 | USA | NULL | 3000 | | 2001 | NULL | NULL | 3010 | | NULL | NULL | NULL | 7535 | +------+---------+------------+-------------+
          Para esta consulta, adicionar ROLLUP faz
          com que a saída inclua uma informação resumida nos qualtro
          níveis de análise, não só em um. Aqui está como
          interpretar a saída ROLLUP:
        
              Seguindo cada conjunto de produtos para um dado ano e
              país, um linha de resumo extra é produzida mostrando o
              total para todos os produtos. Estas linhas têm a coluna
              product atribuída com
              NULL.
            
              Seguindo cada conjunto de linhas para um dado ano, uma
              l;inha resumo extra é produzida mostrando o total para
              todos os países e produtos. Estas linhas têm as colunas
              country e products
              atribuídas com NULL.
            
              Finalmente, seguindo todas as outras linhas, um linha
              resumo extra é produzida mostrando o total geral para
              todos os anos, países e produtos. Esta linha tem as
              colunas year,
              country e products
              atribuídas com NULL.
            
          Outras Considerações ao Usar
          ROLLUP
        
          O seguinte item lista alguns comportamentos específicaos para
          a implementação do ROLLUP no MySQL:
        
          Quando você usa ROLLUP, você não pode
          usar uma cláusula ORDER BY para ordenar os
          resultados. (Em outras palavras, ROLLUP e
          ORDER BY são exclusivos mutualmente.) No
          entanto, você ainda tem algum controle sobre a ordem de
          ordenação. O GROUP BY no MySQL ordena os
          resultados, e você pode usar as palavras chaves
          ASC e DESC
          explicitamente com colunas chamadas na lista GROUP
          BY para especificar a ordem de classificação para
          colunas individuais. (A linha resumo de nível mais alto
          adicionado por ROLLUP ainda aparece depois
          da linha para as quais elas são calculadas, considerando a
          ordenação.)
        
          LIMIT pode ser usado para restringir o
          númerod e linhas retornadas para o cliente.
          LIMIT é aplicado depois do
          ROLLUP, assim o limite se aplica contra as
          linhas extras adicionadas por ROLLUP. Por
          exemplo:
        
mysql>SELECT year, country, product, SUM(profit)->FROM sales->GROUP BY year, country, product WITH ROLLUP->LIMIT 5;+------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | +------+---------+------------+-------------+
          Note que usar LIMIT com
          ROLLUP pode produzir resultados mais
          difíceis de interpretar, porque você têm menos contexto
          para entender as linhas super agrupadas.
        
          O indicador NULL em cada linha
          super-agrupadas são produzidas quando a linha é enviada para
          o cliente. O servidor olha por cada coluna chamada na
          cláusula GROUP BY seguindo aquela mais a
          esquerda que tem o valor alterado. Para qualquer coluna no
          resultado com o nome que é uma combinação léxica de
          qualquer daqueles nomes, seu valor é definido com
          NULL. (Se você especifica o agrupamento de
          colunas pelo número da coluna, o servidor identifica quais
          colunas definir com NULL pelo número.)
        
          Como os valores NULL em linhas super
          agrupadas são colocadas dentro do resultado como um estágio
          posterior no processamento da consulta, você não pode
          testá-los com valores NULL dentro da
          própria consulta. Por exemplo, você não pode adicionar
          HAVING product IS NULL a consulta para
          eliminar da saída todas as linhas com exceção das
          agrupadas.
        
          Por outro lado, o valor NULL aparece como
          NULL no lado do cliente e pode ser testado
          usando qualquer interface de programação do cliente MySQL.
        
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

