none
Operação entre Colunas com Resultados RRS feed

  • Pergunta

  • Saudações,

      Estou com uma duvida sobre como realizar a soma entre os resultados de duas colunas que foram renomeadas com o As.

      A situação é a seguinte: Possuo um relatório onde devo apresentar uma coluna com as entradas, outra coluna com as saídas e uma terceira coluna com o Saldo (Entradas - Saídas). As colunas de entrada e saídas são Selects, preciso pegar o resultado destas colunas e fazer subtrair as saídas da entrada.

      Abaixo está o código que estou utilizando, se testa-lo com o Access funciona, mas com o SQL Server retorna que a coluna Entrada é inválida, já que não existe esta coluna na tabela, ela é o Resultado de um select.

    SELECT COD_CONTAMOV, DESC_CONTAMOV, CONTA_CAIXA,
       (Select
          Sum(MF.VALOR_MOVFIN)
       From
         MOVFIN MF Inner Join PLANO_CONTAS PC on MF.COD_PLACON = PC.COD_PLACON
       Where
          CONTAMOV.COD_CONTAMOV = MF.COD_CONTAMOV and
          MF.DATA_MOVFIN <= :DATA_MOVFINS And
          MF.COD_CCUSTO LIKE :COD_CCUSTOS And
          PC.ENTRADA_SAIDA = 'S') AS SAIDA,
       (Select
          Sum(MF.VALOR_MOVFIN)
       From
         MOVFIN MF Inner Join PLANO_CONTAS PC on MF.COD_PLACON = PC.COD_PLACON
       Where
          CONTAMOV.COD_CONTAMOV = MF.COD_CONTAMOV and
          MF.DATA_MOVFIN <= :DATA_MOVFINE And
          MF.COD_CCUSTO LIKE :COD_CCUSTOE And
          PC.ENTRADA_SAIDA = 'E')  AS ENTRADA,
      ENTRADA - SAIDA AS SALDOFINAL
    FROM
      CONTAMOV
    WHERE
      CONTAMOV.STATUS_CONTAMOV = 'A'
    ORDER BY
      CONTA_CAIXA DESC, DESC_CONTAMOV;

    Agradeço antecipadamente pela ajuda.

    Deus continue a nos abençoar! 

    quinta-feira, 16 de outubro de 2014 15:40

Respostas

  • Boa tarde,

    Christiano, acredito que você também consiga obter o resultado desejado com a query abaixo:

    SELECT 
        c.COD_CONTAMOV, 
        c.DESC_CONTAMOV, 
        c.CONTA_CAIXA,
        Sum(CASE WHEN PC.ENTRADA_SAIDA = 'S' THEN MF.VALOR_MOVFIN ELSE 0 END) AS SAIDA,
        Sum(CASE WHEN PC.ENTRADA_SAIDA = 'E' THEN MF.VALOR_MOVFIN ELSE 0 END) AS ENTRADA,
        Sum(MF.VALOR_MOVFIN * CASE WHEN PC.ENTRADA_SAIDA = 'E' THEN 1 ELSE -1 END) AS SALDOFINAL
    FROM CONTAMOV as c
    INNER JOIN MOVFIN MF 
        ON
            MF.COD_CONTAMOV = c.COD_CONTAMOV and
            MF.DATA_MOVFIN <= :DATA_MOVFINE And
            MF.COD_CCUSTO LIKE :COD_CCUSTOE
    INNER JOIN PLANO_CONTAS PC 
        ON 
            PC.COD_PLACON = MF.COD_PLACON
    WHERE
        c.STATUS_CONTAMOV = 'A'
    GROUP BY
        c.COD_CONTAMOV, 
        c.DESC_CONTAMOV, 
        c.CONTA_CAIXA
    ORDER BY
        c.CONTA_CAIXA DESC, 
        c.DESC_CONTAMOV;

    Espero que ajude.


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

    quinta-feira, 16 de outubro de 2014 17:36

Todas as Respostas

  • Tente algo assim:

    SELECT COD_CONTAMOV, DESC_CONTAMOV, CONTA_CAIXA, Total = (ENTRADA - SAIDA)
    FROM(
    SELECT 
    	COD_CONTAMOV
    	, DESC_CONTAMOV
    	, CONTA_CAIXA,
       (SELECT
          SUM(MF.VALOR_MOVFIN)
       FROM
         MOVFIN MF INNER JOIN PLANO_CONTAS PC on MF.COD_PLACON = PC.COD_PLACON
       Where
          CONTAMOV.COD_CONTAMOV = MF.COD_CONTAMOV AND
          MF.DATA_MOVFIN <= :DATA_MOVFINS AND
          MF.COD_CCUSTO LIKE :COD_CCUSTOS AND
          PC.ENTRADA_SAIDA = 'S') AS SAIDA,
       (SELECT
          SUM(MF.VALOR_MOVFIN)
       FROM
         MOVFIN MF Inner Join PLANO_CONTAS PC on MF.COD_PLACON = PC.COD_PLACON
       Where
          CONTAMOV.COD_CONTAMOV = MF.COD_CONTAMOV AND
          MF.DATA_MOVFIN <= :DATA_MOVFINE AND
          MF.COD_CCUSTO LIKE :COD_CCUSTOE AND
          PC.ENTRADA_SAIDA = 'E')  AS ENTRADA,
      ENTRADA - SAIDA AS SALDOFINAL
    FROM
      CONTAMOV
    WHERE
      CONTAMOV.STATUS_CONTAMOV = 'A'
    ORDER BY
      CONTA_CAIXA DESC, DESC_CONTAMOV
    )


    quinta-feira, 16 de outubro de 2014 16:53
  • Boa tarde,

    Christiano, acredito que você também consiga obter o resultado desejado com a query abaixo:

    SELECT 
        c.COD_CONTAMOV, 
        c.DESC_CONTAMOV, 
        c.CONTA_CAIXA,
        Sum(CASE WHEN PC.ENTRADA_SAIDA = 'S' THEN MF.VALOR_MOVFIN ELSE 0 END) AS SAIDA,
        Sum(CASE WHEN PC.ENTRADA_SAIDA = 'E' THEN MF.VALOR_MOVFIN ELSE 0 END) AS ENTRADA,
        Sum(MF.VALOR_MOVFIN * CASE WHEN PC.ENTRADA_SAIDA = 'E' THEN 1 ELSE -1 END) AS SALDOFINAL
    FROM CONTAMOV as c
    INNER JOIN MOVFIN MF 
        ON
            MF.COD_CONTAMOV = c.COD_CONTAMOV and
            MF.DATA_MOVFIN <= :DATA_MOVFINE And
            MF.COD_CCUSTO LIKE :COD_CCUSTOE
    INNER JOIN PLANO_CONTAS PC 
        ON 
            PC.COD_PLACON = MF.COD_PLACON
    WHERE
        c.STATUS_CONTAMOV = 'A'
    GROUP BY
        c.COD_CONTAMOV, 
        c.DESC_CONTAMOV, 
        c.CONTA_CAIXA
    ORDER BY
        c.CONTA_CAIXA DESC, 
        c.DESC_CONTAMOV;

    Espero que ajude.


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

    quinta-feira, 16 de outubro de 2014 17:36
  • Olá Christiano, 

    Verifica se atende

     SELECT
    	CM.COD_CONTAMOV, 
    	CM.DESC_CONTAMOV, 
    	CM.CONTA_CAIXA,
    	Sum(MF.VALOR_MOVFIN) AS SAIDA,
    	Sum(MF.VALOR_MOVFIN) AS ENTRADA,
    	Sum(MF.VALOR_MOVFIN) - Sum(MF.VALOR_MOVFIN) AS SALDO
    FROM
    	CONTAMOV CM,
    	MOVFIN MFS,
    	MOVFIN MFE,
    	PLANO_CONTAS PC
    WHERE
            MFS.COD_CONTAMOV = CM.COD_CONTAMOV and
            MFS.DATA_MOVFIN <= :DATA_MOVFINS And
            MFS.COD_CCUSTO LIKE :COD_CCUSTOS And
            (PC.ENTRADA_SAIDA = 'S' OR PC.ENTRADA_SAIDA = 'E') AND
            MFE.COD_CONTAMOV = CM.COD_CONTAMOV and
            MFE.DATA_MOVFIN <= :DATA_MOVFINE And
            MFE.COD_CCUSTO LIKE :COD_CCUSTOE
    Qualquer dúvida estou à disposição


    Klayton Gomes MCP /MCTS/ MCPD Analist System / Software Developer

    quinta-feira, 16 de outubro de 2014 17:38
  • Obrigado Gapimex!

    Funcionou perfeitamente.

    Tenho outras consultas que funcionam semelhante a esta, vou tentar implementar sua solução nas outras.

    Agradeço aos demais que dedicaram seu tempo a ajudar um colega!

    Muito obrigado a todos!


    sexta-feira, 17 de outubro de 2014 14:10