Consulta SQL, soma parcial
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?
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
Curtidas 0
Respostas
Eriley Barbosa
22/07/2010
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
GOSTEI 0
Barrys
22/07/2010
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....
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
Eriley Barbosa
22/07/2010
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
GOSTEI 0
Emerson Nascimento
22/07/2010
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.
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
Emerson Nascimento
22/07/2010
complementando...
para uma melhor performance na consulta, crie um índice por data e por status.
para uma melhor performance na consulta, crie um índice por data e por status.
GOSTEI 0
Barrys
22/07/2010
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
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