Ontem um amigo meu, @felipe_cucick me perguntou sobre subtotais para um relatorio.
Pois bem, disse a ele sobre o recurso Rollup do SQL Server, e como prometido, este post contem a explicação:
1. Criei basicamente o mesmo cenario que foi passado por ele porem com uma massa de dados ficticia.
--CRIAÇÃO DE TABELA CREATE TABLE Pacientes_Exames ( Clinica VARCHAR(1000), Paciente VARCHAR(1000), Exame VARCHAR(1000), ValorPago DECIMAL(9,2) ) --CARGA DE DADOS INSERT INTO Pacientes_Exames VALUES ('Clinica 01','Paciente 01','Exame 01', 50.50), ('Clinica 01','Paciente 02','Exame 01', 50.50), ('Clinica 01','Paciente 03','Exame 03', 79.90), ('Clinica 01','Paciente 04','Exame 04', 205.00), ('Clinica 02','Paciente 05','Exame 05', 1000.00), ('Clinica 02','Paciente 06','Exame 01', 50.50), ('Clinica 02','Paciente 07','Exame 07', 150.00), ('Clinica 03','Paciente 08','Exame 08', 155.40), ('Clinica 03','Paciente 09','Exame 03', 79.90), ('Clinica 03','Paciente 10','Exame 10', 60.00) --SELECT COM ROLLUP SELECT a.Clinica, a.Exame, SUM(a.ValorPago) FROM Pacientes_Exames a GROUP BY a.Clinica, a.Exame WITH ROLLUP
Explicação:
O que é o recurso WITH ROLLUP: Este recurso é uma opção da clausula GROUP BY de qualquer select, com ele é possivel a automatização de subgrupos, como este recurso não é muito novo, ele possui suas limitações, por exemplo:
– Trabalhas apenas com o subgrupo do primeiro campo especificado do select.
Para resolver isso, em versões posteriores foi introduzido o WITH CUBE e o GROUPING SETTINGS.
Como funciona: Não que va dar erro, mas para sua utilização consistente, é necessario uma função de agregação, então, o SQL Server ira realizar essa função de agregação para o primeiro campo especificado no select.
É basicamente um select dentro do outro, porem eles vem no mesmo ResultSet, o que é muito bom para programadores.
Para se encontrar o resultado gerado pelo WITH ROLLUP, basta encontrar a coluna cuja qual não seja nem a primeira nem a ultima com o valor NULL.