Sumarizando dados agrupados

Uma grande necessidade que muitos desenvolvedores possuem é a de sumarizar dados em um result set. Confesso que por algum tempo isto foi desconhecido por mim, mas é algo muito útil para algumas aplicações.
Veja abaixo um exemplo prático.

Imagine que você tenha que montar uma query que retorne todos os fornecedores de sua empresa e as categorias que os produtos estão cadastrados. Bem queremos que seja demonstrado o nome do fornecedor, categorias e a quantidade de produtos em cada categoria. Bem, então teremos que agrupar estes dados utilizando a cláusula GROUP BY como pode ser visto abaixo.


SELECT FORNECEDORES.Nome
,PRODUTOS.Categoria
,COUNT(PRODUTOS.Nome)
FROM FORNECEDORES
LEFT JOIN PRODUTOS
ON FORNECEDORES.CODfornecedor=PRODUTOS.CODfornecedor
GROUP BY FORNECEDORES.Nome,PRODUTOS.Categoria

Bem, agora que temos os registros agrupados, vamos inserir um sumário para isto utilizamos o ROLLUP.

GROUP BY FORNECEDORES.Nome,PRODUTOS.Categoria WITH ROLLUP

Isto irá inserir um sumário após cada mudança de fornecedor e no final um sumário de todos os itens. Mas como identificar as linhas de sumário das outras no result set? Para isto basta utilizar o GROUPPING(nome_do_campo) que irá retornar 1 se o registro for de sumário e 0 se não for.

Abaixo segue um exemplo competo, utilizando variáveis de tabela que demonstra como utilizar este código

--CRIA A VARIÁVEL DO TIPO TABELA (FORNECEDORES)
DECLARE @fornecedores TABLE
(
CODFornecedor int identity(1,1),
Nome varchar(100)
)
--CRIA A VARIÁVEL DO TIPO TABELA (PRODUTOS)
DECLARE @produtos TABLE
(
CodProduto int Identity(1,10),
CODFornecedor int,
Nome varchar(100),
Categoria varchar(20)
)
--INSERE REGISTROS FICTÍCIOS PARA TESTE
DECLARE @cod int
INSERT INTO @fornecedores VALUES('ABC ALIMENTICIOS')
SET @cod = @@identity
INSERT INTO @produtos VALUES(@cod,'SABONETE DORGIVAL','HIGIENE')
INSERT INTO @produtos VALUES(@cod,'SABONETE LÍQUIDO RAFAEL','HIGIENE')
INSERT INTO @produtos VALUES(@cod,'SABONETE LÍQUIDO TIELO','HIGIENE')
INSERT INTO @produtos VALUES(@cod,'SABÃO EM PÓ LIDER','LIMPEZA')
INSERT INTO @produtos VALUES(@cod,'ÁGUA SANITÁRIA MARESIA','LIMPEZA')

INSERT INTO @fornecedores VALUES('XYZ LIMITADA')

INSERT INTO @fornecedores VALUES('HHH SAUDE E LIMPEZA')
SET @cod = @@identity
INSERT INTO @produtos VALUES(@cod,'SABONETE LUCAS','HIGIENE')
INSERT INTO @produtos VALUES(@cod,'CREME DENTAL CLARO','HIGIENE')
INSERT INTO @produtos VALUES(@cod,'SABÃO EM PÓ PODEROSO','LIMPEZA')
INSERT INTO @produtos VALUES(@cod,'ÁGUA SANITÁRIA ATEFURA','LIMPEZA')

INSERT INTO @fornecedores VALUES('KKKK SA')

--AGRUPA OS DADOS E SUMARIZA
SELECT CASE WHEN GROUPING (PRODUTOS.Categoria)=1 THEN 'TOTAL' ELSE ''END + ' ' + FORNECEDORES.Nome
,PRODUTOS.Categoria
,COUNT(PRODUTOS.Nome)
FROM @FORNECEDORES FORNECEDORES
LEFT JOIN @PRODUTOS PRODUTOS
ON FORNECEDORES.CODfornecedor=PRODUTOS.CODfornecedor
GROUP BY FORNECEDORES.Nome,PRODUTOS.Categoria WITH ROLLUP

Tiago Gomes Larios

Back To Top