none
Dúvida com consulta RRS feed

  • Pergunta

  • Olá,

    Gostaria que quando fosse feita a consulta abaixo ainda que não houvessem registros na tabela de movimentos fossem exibidas as contas, porém com o valor zerado:

    temos três caixas:

    caixa interno1

    caixa interno2

    caixa interno3

    Nem todo dia os três são movimentados, queria que eu fazer a consulta se não houvesse movimento para esse caixa ele retornasse zero nas outras 3 colunas da consulta, como no exemplo abaixo:

               debito    credito  saldo_anterior

    caixa1   0,0        0,0           12

    caixa2   10,0      120,0        30

    caixa1   25,0      0,0            125

    Inicialmente desconfiei que bastava utilizar os joins de maneira correta, mas ainda não obtive êxito.

    Segue a consulta:

    SELECT
      CC.DESCRICAO,
      MC.CODIGOCONTACORRENTE, 
      [SALDO ANTERIOR] = (SELECT SUM(VALOR) FROM MOVIMENTOCONTACORRENTE MC2 WHERE DATACOMPENSACAO < @data_compensacao AND CANCELADO <> 'T' AND COMPENSADO <> 'F' AND ORDEMESTORNO IS NULL AND TIPOESTORNO IS NULL AND MC2.CODIGOCONTACORRENTE = MC.CODIGOCONTACORRENTE),
      [debito] = case when valor < 0.0 then sum(valor) else 0.0 end,
      [credito] = case when valor > 0.0 then sum(valor) else 0.0 end
    FROM 
      MOVIMENTOCONTACORRENTE MC 
      RIGHT JOIN CADCONTACORRENTE CC ON MC.CODIGOCONTACORRENTE = CC.CODIGOCONTACORRENTE 
    WHERE 
      DATACOMPENSACAO = @data_compensacao 
      AND
      CANCELADO <> 'T' 
      AND
      COMPENSADO <> 'F' 
      AND
      ORDEMESTORNO IS NULL 
      AND
      TIPOESTORNO IS NULL 
      AND
      CC.CODIGOCONTACORRENTE IN ('20302','20201','20101')
    GROUP BY
      MC.VALOR, MC.CODIGOCONTACORRENTE, CC.DESCRICAO
    Desde já agradeço.


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 18 de fevereiro de 2013 15:10

Respostas

  • Fabrizzio,

    Modifiquei a estrutura da consulta e consegui obter o resultado esperado, segue a nova consulta:

    SELECT
      CC.DESCRICAO,
      CC.CODIGOCONTACORRENTE, 
      [SALDO ANTERIOR] = (SELECT SUM(VALOR) FROM MOVIMENTOCONTACORRENTE MC2 WHERE DATACOMPENSACAO < @data_compensacao AND CANCELADO <> 'T' AND COMPENSADO <> 'F' AND ORDEMESTORNO IS NULL AND TIPOESTORNO IS NULL AND MC2.CODIGOCONTACORRENTE = CC.CODIGOCONTACORRENTE),
      [debito] = (SELECT SUM(valor) FROM MOVIMENTOCONTACORRENTE MC3 WHERE VALOR < 0.0 AND DATACOMPENSACAO = @data_compensacao AND CANCELADO <> 'T' AND COMPENSADO <> 'F' AND ORDEMESTORNO IS NULL AND TIPOESTORNO IS NULL AND MC3.CODIGOCONTACORRENTE = CC.CODIGOCONTACORRENTE),
      [credito] = (SELECT SUM(valor) FROM MOVIMENTOCONTACORRENTE MC4 WHERE VALOR > 0.0 AND DATACOMPENSACAO = @data_compensacao AND CANCELADO <> 'T' AND COMPENSADO <> 'F' AND ORDEMESTORNO IS NULL AND TIPOESTORNO IS NULL AND MC4.CODIGOCONTACORRENTE = CC.CODIGOCONTACORRENTE)
    FROM 
     CADCONTACORRENTE CC
    WHERE 
     CC.CODIGOCONTACORRENTE IN ('20302','20201','20101')
    Obrigado pela ajuda.


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Marcos Rocha segunda-feira, 18 de fevereiro de 2013 16:43
    segunda-feira, 18 de fevereiro de 2013 16:43

Todas as Respostas

  • Marcos,

    Só para ajudar na programação, como esta aparecendo agora o resultado?

    Todo caso, creio que este possa funcionar:

    SELECT

    CC

    .DESCRICAO,

    MC

    .CODIGOCONTACORRENTE,

    (SELECT SUM(VALOR) FROM MOVIMENTOCONTACORRENTE MC2 WHERE DATACOMPENSACAO < @data_compensacao AND CANCELADO <> 'T' AND COMPENSADO <> 'F' AND ORDEMESTORNO IS NULL AND TIPOESTORNO IS NULL AND MC2.CODIGOCONTACORRENTE = MC.CODIGOCONTACORRENTE) As [SALDO ANTERIOR]

    CASE WHEN ISNULL(valor, 0) < 0.0 THEN sum(valor) else 0.0 end As [debito]

    CASE WHEN ISNULL(valor, 0) > 0.0 then sum(valor) else 0.0 end As [credito]

    FROM

    MOVIMENTOCONTACORRENTE MC

    LEFT JOIN CADCONTACORRENTE CC ON MC.CODIGOCONTACORRENTE = CC.CODIGOCONTACORRENTE

    WHERE

    DATACOMPENSACAO

    = @data_compensacao

    AND

    CANCELADO

    <> 'T'

    AND

    COMPENSADO

    <> 'F'

    AND

    ORDEMESTORNO

    IS NULL

    AND

    TIPOESTORNO

    IS NULL

    AND

    CC

    .CODIGOCONTACORRENTE IN ('20302','20201','20101')

    GROUP

    BY

    MC

    .VALOR, MC.CODIGOCONTACORRENTE, CC.DESCRICAO


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com


    segunda-feira, 18 de fevereiro de 2013 15:17
    Moderador
  • Fabrizzio,

    Antes de mais nada obrigado.

    Quando coloco uma data que não houve movimentação a consulta não retorna nenhuma linha, quando coloco uma data que houve movimentação os caixas que não foram movimentados não aparecem, só aparecem aqueles que foram movimentados.


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 18 de fevereiro de 2013 16:36
  • Fabrizzio,

    Modifiquei a estrutura da consulta e consegui obter o resultado esperado, segue a nova consulta:

    SELECT
      CC.DESCRICAO,
      CC.CODIGOCONTACORRENTE, 
      [SALDO ANTERIOR] = (SELECT SUM(VALOR) FROM MOVIMENTOCONTACORRENTE MC2 WHERE DATACOMPENSACAO < @data_compensacao AND CANCELADO <> 'T' AND COMPENSADO <> 'F' AND ORDEMESTORNO IS NULL AND TIPOESTORNO IS NULL AND MC2.CODIGOCONTACORRENTE = CC.CODIGOCONTACORRENTE),
      [debito] = (SELECT SUM(valor) FROM MOVIMENTOCONTACORRENTE MC3 WHERE VALOR < 0.0 AND DATACOMPENSACAO = @data_compensacao AND CANCELADO <> 'T' AND COMPENSADO <> 'F' AND ORDEMESTORNO IS NULL AND TIPOESTORNO IS NULL AND MC3.CODIGOCONTACORRENTE = CC.CODIGOCONTACORRENTE),
      [credito] = (SELECT SUM(valor) FROM MOVIMENTOCONTACORRENTE MC4 WHERE VALOR > 0.0 AND DATACOMPENSACAO = @data_compensacao AND CANCELADO <> 'T' AND COMPENSADO <> 'F' AND ORDEMESTORNO IS NULL AND TIPOESTORNO IS NULL AND MC4.CODIGOCONTACORRENTE = CC.CODIGOCONTACORRENTE)
    FROM 
     CADCONTACORRENTE CC
    WHERE 
     CC.CODIGOCONTACORRENTE IN ('20302','20201','20101')
    Obrigado pela ajuda.


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Marcos Rocha segunda-feira, 18 de fevereiro de 2013 16:43
    segunda-feira, 18 de fevereiro de 2013 16:43