Fórum Consulta SQL, soma parcial #381960

22/07/2010

0

Pessoal, bom dia!

Possuo uma tabela para controlar movimento bancário
Nesta tabela existe campos de VALOR e de TIPO(débito ou crédito)
Estou tentando mostrar o relatorio da seguinte maneira:

    Data                Debito                  Credito                   SALDO

10/07/2010             0,50               
10/07/2010           25,20
11/07/2010                                         20,00
11/07/2010           50,00


Gostaria muito de mostrar o SALDO PARCIAL, somando os campos parcialmente...
Minha consulta está abaixo

SELECT l.data, l.numero, l.descricao,
       CASE
         WHEN l.tipo = 'D' THEN l.valor
         ELSE null
       END AS debito,
       CASE
         WHEN l.tipo = 'C' THEN l.valor
         ELSE null
       END AS credito
FROM lancamentos l
WHERE l.status <> 'EXCLUIDO'


Alguem pode ajudar?



Barrys

Barrys

Responder

Posts

22/07/2010

Eriley Barbosa

Ao meu ver, tu só podes fazer isso utilizando uma stored procedure selecionavel, se estiver utilizando Firebird, de uma olhada no link abaixo:   http://www.comunidade-firebird.org/cflp/downloads/CFLP_T003.PDF   Atenciosamente   Eriley
Responder

Gostei + 0

22/07/2010

Barrys

Ainda nao consegui...  mas avancei um pouco em realação ao codigo

SELECT l.data, l.numero, l.descricao,
  COALESCE(SUM((CASE WHEN l.tipo = 'C' THEN l.valor ELSE 0 END)),0) AS CREDITO,
  COALESCE(SUM((CASE WHEN l.tipo = 'D' THEN l.valor ELSE 0 END)),0) AS DEBITO,
  COALESCE(SUM((CASE WHEN l.tipo = 'C' THEN l.valor ELSE 0 END)),0) -
  COALESCE(SUM((CASE WHEN l.tipo = 'D' THEN l.valor ELSE 0 END)),0) AS SALDO
FROM
  lancamentos l
GROUP BY
  data, numero, descricao


Só de desta forma eu mostro o saldo da linha....  gostaria de pegar o saldo do linha anterior e somar com o da linha atual....


Responder

Gostei + 0

22/07/2010

Eriley Barbosa

Eu entendi o que tu estás tentando fazer e é justamente o que estou tentando lhe dizer, que tu só vai conseguir o que tu quer utilizando stored procedures. Atenciosamente   Eriley
Responder

Gostei + 0

22/07/2010

Emerson Nascimento

tente com a instrução abaixo:

SELECT
  l.data,
  sum(case when l.tipo = 'C' then l.valor else 0 end) CREDITO,
  sum(case when l.tipo = 'D' then l.valor else 0 end) DEBITO,
  (SELECT sum(case when l2.tipo = 'C' then l2.valor else 0 end)-
          sum(case when l2.tipo = 'D' then l2.valor else 0 end)
   FROM
     lancamentos l2
   WHERE
     l2.data <= l.data and l2.status <> 'EXCLUIDO') SALDO
FROM
  lancamentos l
WHERE
  l.status <> 'EXCLUIDO'
GROUP BY
  data

o segredo está no uso da subselect para obter o saldo.

Responder

Gostei + 0

22/07/2010

Emerson Nascimento

complementando...

para uma melhor performance na consulta, crie um índice por data e por status.

Responder

Gostei + 0

22/07/2010

Barrys

Aewww!!!!

Conforme sugestão de Emerson, criei um novo campo na tabela chamado SEQUENCIA para diferenciar os registros...
e a solução ficou da seguinte forma:

SELECT
  l.data, l.numero, l.descricao, l.lote_processo, l.sequencia,
  sum(case when l.tipo = 'C' then l.valor else 0 end) CREDITO,
  sum(case when l.tipo = 'D' then l.valor else 0 end) DEBITO,
  (SELECT sum(case when l2.tipo = 'C' then l2.valor else 0 end)-
          sum(case when l2.tipo = 'D' then l2.valor else 0 end)
   FROM
     lancamentos l2
   WHERE
     l2.data <= l.data
     and l2.sequencia <= l.sequencia
     and l2.status <> 'EXCLUIDO') SALDO
FROM
  lancamentos l
WHERE
  l.status <> 'EXCLUIDO'
GROUP BY
  sequencia, data, numero, descricao, lote_processo


Obrigado aos parceiros Emeson e ERILEY VILAGRANDE BARBOSA pela solução!



"Quem não tem gratidão, não tem caráter!"
 Jorge Reis da Costa



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar