[Resolvido] Gerando Somatórios
totalizando, somando dados:
no SQL Server, para estas operações de somar e totalizar podemos usar as seguintes funções:
- COMPUTE: realiza somatórios, nos agrupamentos divide os grupos em result-sets diferentes.
Podem ser usados outros operadores no compute: { AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM }
- ROLLUP: realiza somatórios, nos agrupamentos mantém em um único result-sets
- CUBE: realiza somatórios, nos agrupamentos mantém em um único result-sets e no final gera totais por grupos
Dados para testes:
set nocount ondeclare @tab table (IDProduto char(5), Nome varchar(10), valor money)insert into @tab (IDProduto, Nome, valor) values (1, 'Norte', 10)insert into @tab (IDProduto, Nome, valor) values (1, 'Sul', 20)insert into @tab (IDProduto, Nome, valor) values (2, 'Norte', 5)insert into @tab (IDProduto, Nome, valor) values (2, 'Norte', 15)insert into @tab (IDProduto, Nome, valor) values (2, 'Norte', 25)insert into @tab (IDProduto, Nome, valor) values (1, 'Leste', 10)insert into @tab (IDProduto, Nome, valor) values (3, 'Oeste', 15)insert into @tab (IDProduto, Nome, valor) values (3, 'Oeste', 5)insert into @tab (IDProduto, Nome, valor) values (3, 'Norte', 5)
Exemplo com [COMPUTE](http://msdn2.microsoft.com/en-US/library/ms181708.aspx):
select IDProduto, Nome, valor from @tab order by IDProduto compute sum(valor) by IDProduto compute sum(valor)resultado da query acima:
IDProduto Nome valor --------- ---------- --------------------- 1 Norte 10.0000 1 Sul 20.0000 1 Leste 10.0000 sum ===================== 40.0000 IDProduto Nome valor --------- ---------- --------------------- 2 Norte 25.0000 2 Norte 5.0000 2 Norte 15.0000 sum ===================== 45.0000 IDProduto Nome valor --------- ---------- --------------------- 3 Oeste 15.0000 3 Oeste 5.0000 3 Norte 5.0000 sum ===================== 25.0000 sum ===================== 110.0000
Exemplo com **[ROLLUP](http://msdn2.microsoft.com/en-us/library/ms189305.aspx)**:
select case when (grouping(IDProduto)=1) then 'TOTAL' else isnull(IDProduto, 'desconhecido') end as IDProduto, case when (grouping(Nome)=1) then 'SUB-TOTAL' else isnull(Nome, 'desconhecido') end as Nome, sum(valor) as valor from @tab group by IDProduto, Nome WITH ROLLUPresultado da query acima:
IDProduto Nome valor --------- ---------- --------------------- 1 Leste 10.0000 1 Norte 10.0000 1 Sul 20.0000 1 SUB-TOTAL 40.0000 2 Norte 45.0000 2 SUB-TOTAL 45.0000 3 Norte 5.0000 3 Oeste 20.0000 3 SUB-TOTAL 25.0000 TOTAL SUB-TOTAL 110.0000
Exemplo com [CUBE](http://msdn2.microsoft.com/en-us/library/ms175939.aspx):
select case when (grouping(IDProduto)=1) then 'TOTAL' else isnull(IDProduto, 'desconhecido') end as IDProduto, case when (grouping(Nome)=1) then 'SUB-TOTAL' else isnull(Nome, 'desconhecido') end as Nome, sum(valor) as valor from @tab group by IDProduto, Nome WITH CUBEresultado da query acima:
IDProduto Nome valor --------- ---------- --------------------- 1 Leste 10.0000 1 Norte 10.0000 1 Sul 20.0000 1 SUB-TOTAL 40.0000 2 Norte 45.0000 2 SUB-TOTAL 45.0000 3 Norte 5.0000 3 Oeste 20.0000 3 SUB-TOTAL 25.0000 TOTAL SUB-TOTAL 110.0000 TOTAL Leste 10.0000 TOTAL Norte 60.0000 TOTAL Oeste 20.0000 TOTAL Sul 20.0000no exemplo podemos observar tb. o uso da função [GROUPING](http://msdn2.microsoft.com/en-us/library/ms178544.aspx), com esta função verificamos se o retorno refere-se a uma linha de sub-totais ou a uma linha de totais
AUTOR: "eriva_br"
Dúvidas, criticas, contribuições, correções e adições seram bem vindas.
Discussão (0)
Carregando comentários...