Usuário com melhor resposta
Mostrando Sub Totais

Pergunta
-
Tenho uma tabela que traz as seguintes informações.
ID | CONTA | VALOR | GRUPO1 | receitasvendasUN1 | 100,00 | receitabruta
2 | receitasvendasUN2 | 70,00 | receitabruta
3 | compramateriaprima1 | 20,00 | materiaprima4 | saida impostos | 15,00 | Impostos
Preciso trazer os subtotais abaixo de cada grupo, usando a soma anterior.
Por exemplo.
receitabruta - materiaprima ( abaixo de todo o grupo materiaprima )
receitabruta - materiaprima - impostos ( abaixo do grupo impostos )
Respostas
-
Deleted
- Marcado como Resposta William_droops terça-feira, 6 de agosto de 2019 19:26
Todas as Respostas
-
-
William,
Existe alguma relação ou hierarquia entre estes grupos?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
-
-
Deleted
- Marcado como Resposta William_droops terça-feira, 6 de agosto de 2019 19:26
-
-
William,
Pois bem, pensei em algo aqui, não sei se é isso que você precisa, pois sem qualquer nível hierarquico dos dados ou relacionamento mesmo que fosse um autorelacimento já ajudaria, neste caso, vamos meio que no escuro.
Eu elaborei um exemplo com base na pequena massa de dados que você postou, veja abaixo para ser utilizado a partir do SQL Server 2012:
Create Table Contas (Id Int Primary key Identity(1,1), Conta Varchar(20) Not Null, Valor Decimal(6,2) Not Null, Grupo Varchar(20) Not Null) Go Insert Into Contas (Conta, Valor, Grupo) Values ('receitasvendasUN1' , 100, 'receitabruta'), ('receitasvendasUN2',70, 'receitabruta'), ('compramateriaprima1', 20, 'materiaprima'), ('saida impostos', 15,'Impostos') Go -- Obtendo a somatória por grupo -- ;With CTESomarPorGrupo (Id, Grupo, SomatoriaGrupo) As ( Select Id, Grupo, Sum(Valor) Over (Partition By Grupo Order By Grupo Asc) From Contas Group By Id, Grupo, Valor ), -- Obtendo a somatoria parcial-- CTESomatoriaGeral (Id, Nivel1, Nivel2, Grupo, SomatoriaParcial) As ( Select Id, Lead(Id,1,0) Over (Order By Id Asc) As Nivel1, Lead(Id,2,0) Over (Order By Id Asc) As Nivel1, Grupo, Sum(SomatoriaGrupo) As SomatoriaGeral From CTESomarPorGrupo Group By Id, Grupo ) -- Obtendo as somatorias gerais -- Select Concat(CT.Grupo, ' - ',CT1.Grupo, ' - ', CT2.Grupo) As Grupos, CT1.SomatoriaParcial As Grupo1, CT2.SomatoriaParcial As Grupo2, (CT1.SomatoriaParcial+CT2.SomatoriaParcial) As 'Total Parcial', (Select Sum(Valor) From Contas) As 'Somatória Geral', (Select Sum(Valor)+CT1.SomatoriaParcial+CT2.SomatoriaParcial From Contas) As 'Somatória Geral Acumulado' From CTESomatoriaGeral CT Inner Join CTESomatoriaGeral CT1 On CT1.Id = CT.Nivel1 Inner Join CTESomatoriaGeral CT2 On CT2.Id = CT.Nivel2 Order By CT.Id Desc Go
Ressalto que este é um exemplo, um esboço de código que elaborei com base no meu entendimento, com certeza existem melhorias, ajustes e correções, mas acredito que possa ser útil de alguma forma.
Podemos posteriormente pensar em evoluir isso para um Pivot, ou caso venha a ser necessário converter para uma View ou armazenar o resultado em outra tabela.
Vou ajustar outro Código para você usar na sua versão!
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Editado Junior Galvão - MVPMVP terça-feira, 6 de agosto de 2019 22:27
-