Fórum Consulta SQL, soma parcial #381960
22/07/2010
0
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
Curtir tópico
+ 0Posts
22/07/2010
Eriley Barbosa
Gostei + 0
22/07/2010
Barrys
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....
Gostei + 0
22/07/2010
Eriley Barbosa
Gostei + 0
22/07/2010
Emerson Nascimento
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.
Gostei + 0
22/07/2010
Emerson Nascimento
para uma melhor performance na consulta, crie um índice por data e por status.
Gostei + 0
22/07/2010
Barrys
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)