Cláusula WITH ROLLUP com GROUP BY – Esta cláusula determina que, além das linhas normalmente oferecidas pelo GROUP BY, também sejam obtidas como resultado as linhas de sumário. O sumário dos grupos é feito em uma ordem hierárquica, a partir do nível mais baixo até o mais alto. A ordem que define a hierarquia do grupo é determinada pela ordem na qual são definidas as colunas agrupadas. Caso esta ordem seja alterada, consequentemente a quantidade de linhas produzidas pode ser afetada.
Usada em parceria com o GROUP BY, a WITH ROLLUP acrescenta uma linha na qual são exibidos os subtotais e totais dos registros já distribuídos em colunas agrupadas. Assim, é possível analisar diversas informações em uma só consulta, por exemplo, o fabricante do produto que possui maior quantidade de unidades em estoque ou mesmo o tipo de produto cujo valor estocado ultrapassa os 100 mil.
Veja abaixo a instrução e o resultado de um exemplo com o WITH ROLLUP:
SELECT Tipo, Fabricante, Nome, SUM(Quantidade) AS 'Quantidade em Estoque', SUM(Quantidade * VlUnitario) AS 'Valor em Estoque'
FROM Produtos
GROUP BY Tipo, Fabricante, Nome
WITH ROLLUP

Perceba que o resultado da consulta é bem completo, com diversas informações.
Cláusula CUBE com GROUP BY – A cláusula CUBE tem a finalidade de determinar que as linhas de sumário sejam inseridas no conjunto de resultados. A linha de sumário é retornada para cada combinação possível de grupos e de subgrupos no conjunto de resultados.
Visto que a cláusula CUBE é responsável por retornar todas as combinações possíveis de grupos e subgrupos, a quantidade de linhas não está relacionada à ordem em que são determinadas as colunas de agrupamento. Portanto, é mantida a quantidade de linhas já apresentada.
A quantidade de linhas de sumário no conjunto de resultados é especificada de acordo com a quantidade de colunas incluídas na cláusula GROUP BY. Cada uma dessas colunas é vinculada sob o valor NULL do agrupamento, o qual é aplicado a todas as outras colunas.
A cláusula WITH CUBE, em conjunto à GROUP BY, gera totais e subtotais, apresentando vários agrupamentos de acordo com as colunas definidas no GROUP BY. Veja um exemplo e seu resultado abaixo:
SELECT Tipo, Fabricante, Nome, SUM(Quantidade) AS 'Quantidade em Estoque', SUM(Quantidade * VlUnitario) AS 'Valor em Estoque'
FROM Produtos
GROUP BY Tipo, Fabricante, Nome
WITH CUBE

Note que é retornado mais de 60 registros.
Cláusula JOIN com GROUP BY – Mais uma cláusula usada junto com GROUP BY, a JOIN permite incluir dados adicionais sobre um determinado agrupamento, dados estes que estão disponíveis em outra tabela (mais sobre JOINS no artigo sobre Associação de Tabelas). Vamos supor as tabelas Cargo e Funcionario a seguir (também do artigo citado anteriormente):
Assim podemos relacionar essas tabelas por meio do JOIN e usar em conjunto com o GROUP BY. Veja como na instrução a seguir, e seu respectivo resultado:
SELECT F.NomeFuncionario, C.NomeCargo, F.SalarioFuncionario
FROM Funcionario as F
INNER JOIN Cargo as C
ON C.IdCargo = F.IdCargo
GROUP BY F.NomeFuncionario, C.NomeCargo, F.SalarioFuncionario
Fonte de Consulta: Apostila de SQL Server, da Impacta Tecnologia.
Assim finalizo o artigo. Muito obrigado a todos!Um abraço, e até o próximo artigo.
Wellington Balbo de Camargo