none
Utilizar a função SUM RRS feed

  • Pergunta

  • Bom Dia!

    Primeiro gostaria de informar que não sou da área de TI, porém gosto da área e de aprender.

    É possível totalizar o resultado do case em uma só linha?

    Abaixo a sentença toda.

    Desde já agradeço pela ajuda.

    select      *,

                CASE

                      WHEN DEBITO.NATUREZA = 1 AND (CREDITO.NATUREZA = 0 OR CREDITO.NATUREZA = 1 or CREDITO.NATUREZA IS null)

                      THEN ISNULL(DEBITO.VALOR,0) - ISNULL(CREDITO.VALOR,0)

                      ELSE ISNULL(CREDITO.VALOR,0) - ISNULL(DEBITO.VALOR,0)

                END MOVIMENTO

               

    from

    (

    select      CP.DATA,

                      CP.CODCCUSTO,

                      CP.DEBITO,

                      CC.CODCONTA,

                CC.DESCRICAO,

                isnull(SUM(CP.VALOR),0) VALOR,

                CP.CODCOLDEBITO,

                      CC.NATUREZA

    from  CPARTIDA CP (NOLOCK)

    LEFT OUTER JOIN CCONTA CC (NOLOCK)

    ON          CC.CODCOLIGADA = CP.CODCOLDEBITO

    AND         CC.CODCONTA = CP.DEBITO

    WHERE CP.DEBITO IS NOT NULL

    AND     CP.DATA BETWEEN '20130101' AND '20130131'

    AND         CC.CODCONTA = '3.1.1.01.001.001'

    GROUP BY    CP.DATA,

                      CP.CODCCUSTO,

                      CP.DEBITO,

                      CC.CODCONTA,

                CC.DESCRICAO,

                CP.CODCOLDEBITO,

                CC.NATUREZA

    ) DEBITO

    full outer join

    (

    select      CP.DATA,

                      CP.CODCCUSTO,

                CP.CREDITO,

                CC.CODCONTA,

                CC.DESCRICAO,

                isnull(SUM(CP.VALOR),0) VALOR,

                CP.CODCOLCREDITO,

                CC.NATUREZA

    from  CPARTIDA CP (NOLOCK)

    LEFT OUTER JOIN CCONTA CC (NOLOCK)

    ON          CC.CODCOLIGADA = CP.CODCOLCREDITO

    AND         CC.CODCONTA = CP.CREDITO

    WHERE CP.CREDITO IS NOT NULL

    AND     CP.DATA BETWEEN '20130101' AND '20130131'

    AND         CC.CODCONTA = '3.1.1.01.001.001'

    GROUP BY    CP.DATA,

                CP.CODCCUSTO,

                CC.CODCONTA,

                CP.CREDITO,

                CC.DESCRICAO,

                CP.CODCOLCREDITO,

                CC.NATUREZA) CREDITO

    on    DEBITO.DEBITO=CREDITO.CREDITO

    AND DEBITO.CODCOLDEBITO=CREDITO.CODCOLCREDITO

    AND DEBITO.CODCCUSTO=CREDITO.CODCCUSTO

    AND   DEBITO.NATUREZA=CREDITO.NATUREZA

    where CREDITO.CREDITO = '3.1.1.01.001.001'

    OR          DEBITO.DEBITO = '3.1.1.01.001.001'

    order by    DEBITO.DATA,

                      DEBITO.DEBITO

    quarta-feira, 13 de novembro de 2013 09:26

Respostas

  • Bom dia Paulo,

    Segue um pequeno exemplo bem simples do uso do SUM com case.

    declare	@tabela table (idconta int, valor decimal(8,2))
    
    insert into @tabela values (1,100);
    insert into @tabela values (1,800);
    insert into @tabela values (2,100);
    insert into @tabela values (2,2000);
    
    
    select
    	case when (idconta = 1) then valor * -1
    		else valor
    	end as total
    from @tabela
    
    select
    	sum(case when (idconta = 1) then valor * -1
    		else valor
    	end) as total
    from @tabela

    Vale lembrar que quando usamos funções de agregação, neste caso o sum, todos os atributos que não fazem parte da função de agregação deve estar em um GROUP BY. No seu exemplo, vc deixou o *, que faz com que a query retorne todos os demais atributos além no seu proprio case. Então, quando vc utilizar o sum, ou voce terá que colocar esses atributos que estao fora do case (*) em um group by, ou listar somente o resultado do case, retirando o *,

    At.
    Rafael

    • Marcado como Resposta Paulo Netto quarta-feira, 13 de novembro de 2013 14:58
    quarta-feira, 13 de novembro de 2013 11:56

Todas as Respostas

  • Bom dia Paulo,

    Segue um pequeno exemplo bem simples do uso do SUM com case.

    declare	@tabela table (idconta int, valor decimal(8,2))
    
    insert into @tabela values (1,100);
    insert into @tabela values (1,800);
    insert into @tabela values (2,100);
    insert into @tabela values (2,2000);
    
    
    select
    	case when (idconta = 1) then valor * -1
    		else valor
    	end as total
    from @tabela
    
    select
    	sum(case when (idconta = 1) then valor * -1
    		else valor
    	end) as total
    from @tabela

    Vale lembrar que quando usamos funções de agregação, neste caso o sum, todos os atributos que não fazem parte da função de agregação deve estar em um GROUP BY. No seu exemplo, vc deixou o *, que faz com que a query retorne todos os demais atributos além no seu proprio case. Então, quando vc utilizar o sum, ou voce terá que colocar esses atributos que estao fora do case (*) em um group by, ou listar somente o resultado do case, retirando o *,

    At.
    Rafael

    • Marcado como Resposta Paulo Netto quarta-feira, 13 de novembro de 2013 14:58
    quarta-feira, 13 de novembro de 2013 11:56
  • Boa Tarde!

    Obrigado Rafael. 

    Ajudou muito.

    quarta-feira, 13 de novembro de 2013 14:58