none
Select em entrada e saída - Sql Server RRS feed

  • 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
    segunda-feira, 22 de fevereiro de 2016 13:54

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

    segunda-feira, 22 de fevereiro de 2016 14:35
  • 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

    segunda-feira, 22 de fevereiro de 2016 14:51
  • 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

    segunda-feira, 22 de fevereiro de 2016 15:03
  • Sim deu certo porem falto a coluna do nome do mês o sql server da essa opção no select ou não?
    segunda-feira, 22 de fevereiro de 2016 17:33
  • Experimente acrescentar o trecho abaixo depois do último Select:

        datename(month, d.Data) as Mes,

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 22 de fevereiro de 2016 17:53
  • 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
    segunda-feira, 22 de fevereiro de 2016 18:11
  • 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

    segunda-feira, 22 de fevereiro de 2016 18:30
  • 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]

    terça-feira, 23 de fevereiro de 2016 14:01
  • 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

    terça-feira, 23 de fevereiro de 2016 14:57
  • 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]

    terça-feira, 23 de fevereiro de 2016 16:42