Inquiridor
Select em entrada e saída - Sql Server

Discussão Geral
-
Bom dia a todos
preciso fazer um select para mim demostra as minha saída e entradas do meu fluxo de caixa tenho uma tabelas chamada tabflcx nela tenho um campo de valor, data e o campo statos onde controlo se foi entrada ou saída, preciso que ela mim retorne o fluxo no período idepedente se teve movimento ou não conforme a imagem abaixo
alguém pode mim ajudar?
der de já agradeço a todos pela atenção...
- Tipo Alterado Marcos SJ segunda-feira, 22 de fevereiro de 2016 14:10 Threads de "How to" serão modificadas para discussão geral
- Editado Rhael_Andrade terça-feira, 12 de novembro de 2019 12:39
Todas as Respostas
-
Bom dia,
Experimente mais ou menos dessa forma:
with CTE_Datas as ( select @DataIni as Data union all select dateadd(day, 1, Data) from CTE_Datas where Data < @DataFim ), CTE_Sum as ( select Data, sum(case when Status = 'E' then Valor else 0 end) as Entrada, sum(case when Status = 'S' then Valor else 0 end) as Saida from Tabela group by Data ) select d.Data, s.Entrada, s.Saida from CTE_Datas as d left join CTE_Sum as s on s.Data = d.Data
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
cara deu esse erro
Mensagem 137, Nível 15, Estado 2, Linha 4 É necessário declarar a variável escalar "@DataIni". Mensagem 137, Nível 15, Estado 2, Linha 8 É necessário declarar a variável escalar "@DataFim".
esses campo seria a data inicial e a final?
ficaria algo como assim
-
Seriam parâmetros ou variáveis do tipo Date contendo a data inicial e a data final.
Acho que se for para deixar as datas fixas será necessário utilizar o Cast ou Convert para converter as datas para o tipo Date. Ex:
with CTE_Datas as ( select cast('20151201' as date) as Data union all select dateadd(day, 1, Data) from CTE_Datas where Data < cast('20151231' as date) ),
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
-
Experimente acrescentar o trecho abaixo depois do último Select:
datename(month, d.Data) as Mes,
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
deu certo porem eu fiz um filtro de novembro a dezembro e o total da entrada e da saída não esta calculando no fim do mês preciso fazer o quer pra que retorne o total conforme a imagem abaixo
- Editado Rhael_Andrade terça-feira, 12 de novembro de 2019 12:39
-
Experimente deixar a parte final da seguinte forma:
select datename(month, d.Data) as Mes, d.Data, sum(s.Entrada) as Entrada, sum(s.Saida) as Saida from CTE_Datas as d left join CTE_Sum as s on s.Data = d.Data group by grouping sets ((month(d.Data), d.Data), (month(d.Data)))
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
Bom dia,
Experimente mais ou menos dessa forma:
with CTE_Datas as ( select @DataIni as Data union all select dateadd(day, 1, Data) from CTE_Datas where Data < @DataFim ), CTE_Sum as ( select Data, sum(case when Status = 'E' then Valor else 0 end) as Entrada, sum(case when Status = 'S' then Valor else 0 end) as Saida from Tabela group by Data ) select d.Data, s.Entrada, s.Saida from CTE_Datas as d left join CTE_Sum as s on s.Data = d.Data
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
Gapimex,
Gostaria de fazer uma consideração, ao invês de utilizar o SUM em conjunto com o CASE não seria melhor fazer uso de uma subquery e dentro desta subquery fazer a soma dos dados filtrando de acordo com a condição. Acredito que a performance será bem melhor se utilizar uma subquery ao invês da função SUM em conjunto com o CASE, principalmente se o volume de dados for grande.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Junior,
Acho que vale o teste, mas acho que com o uso do Sum em conjunto com o Case será realizada apenas uma leitura na tabela.
Rhael, caso queira fazer o teste, seguem as 2 versões (obs: foi adicionado o Where na segunda CTE da sugestão inicial):
with CTE_Datas as ( select cast('20151201' as date) as Data union all select dateadd(day, 1, Data) from CTE_Datas where Data < cast('20151231' as date) ), CTE_Sum as ( select Data, sum(case when Status = 'E' then Valor else 0 end) as Entrada, sum(case when Status = 'S' then Valor else 0 end) as Saida from Tabela where Data between '20151201' and '20151231' group by Data ) select datename(month, d.Data) as Mes, d.Data, sum(s.Entrada) as Entrada, sum(s.Saida) as Saida from CTE_Datas as d left join CTE_Sum as s on s.Data = d.Data group by grouping sets ((month(d.Data), d.Data), (month(d.Data)))
with CTE_Datas as ( select cast('20151201' as date) as Data union all select dateadd(day, 1, Data) from CTE_Datas where Data < cast('20151231' as date) ), CTE_Sum as ( select d.Data, (select sum(Valor) from Tabela as t where t.Data = d.Data and Status = 'E') as Entrada, (select sum(Valor) from Tabela as t where t.Data = d.Data and Status = 'S') as Saida from CTE_Datas as d ) select datename(month, d.Data) as Mes, d.Data, sum(s.Entrada) as Entrada, sum(s.Saida) as Saida from CTE_Datas as d left join CTE_Sum as s on s.Data = d.Data group by grouping sets ((month(d.Data), d.Data), (month(d.Data)))
Abs
Assinatura: http://www.imoveisemexposicao.com.br
-
Gapimex,
Até pode ser, mas uma boa prática em relação a performance é procurar evitar o uso de funções de agrupamento de dados em conjunto com operadores lógicos condicionais, neste caso o Case poderá ser o grande vilão da história.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]