GARANTIR DESCONTO

Fórum sql soma valores duplicados #50513

13/04/2005

0

Estou executando essa sql:
select p.codigo,p.saldo_inicializacao,sum(distinct c.valor) as credito,sum(distinct d.valor) as debito
from plano p
left outer join lancamento c on (c.cod_emp=p.cod_emp and c.conta_credito=p.codigo and
c.mes_ano_base<´2004-10-01´ and c.situacao=1)
left outer join lancamento d on (d.cod_emp=p.cod_emp and d.conta_debito=p.codigo and
d.mes_ano_base<´2004-10-01´ and d.situacao=1)
where p.cod_emp=1 and p.codigo=53

group by p.codigo,p.saldo_inicializacao

só q ela está me retornando a soma de valores duplicados, por exemplo:
Conta_credito Conta_debito Valor
53 106 10,00
53 201 12,00
53 106 8,00
254 53 15,00
O resultado teria q ser o seguinte:
Conta Debito Credito
53 15,00 30,00
106 18,00 0
201 12,00 0
254 0 15,00

Mas o q a minha sql está fazendo é, a cada conta ele lista o restante, exemplo:
conta1 conta2
53 106
53 201
53 254
106 53
106 201
106 254
106 106
201 106
201 254
201 53
254 53
254 106
254 201

Imagina como ficaria a soma :( . Um exemplo que tenho aqui, é a conta 53, onde o valor do crédito deveria ser de 20 e o débito de 82, mas com essa sql o valor do crédito é 140 e do débito 164, onde estou errando??? :cry:

Obrigada
Livia


Livia

Livia

Responder

Posts

14/04/2005

Fsflorencio

Olá Livia, não entendí direito.
A representação em forma de tabela se referem aos campos: Conta_credito Conta_debito Valor. E o sql seleciona: p.codigo, saldo_inicializacao, credito, debito.
Tem como dar uma explicada melhor?


Responder

Gostei + 0

14/04/2005

Livia

Minha sql seleciona o codigo que no exemplo é a conta credito e a conta débito e dependendo da conta ele soma a credito ou a débito.
Por exemplo, na tabela de lancamento tenho conta crédito, conta débito e o valor. A minha conta crédito seria 53 e a minha conta débito seria 106 e o valor de 10,00. A minha sql traria
Codigo credito debito
53 10 0
106 0 10

Como tenho mais lançamentos, acho q acaba se perdendo ou algo parecido, talvez a condição esteja errado, ou sei lá...


Responder

Gostei + 0

14/04/2005

Livia

Consegui resolver: :lol:
select distinct(c.codigo),c.saldo_inicializacao,
(select sum(l.valor)
from lancamento l
where (l.conta_credito=c.codigo) and
l.cod_emp=p.cod_emp and l.mes_ano_base=p.mes_ano_base and l.situacao=´1´) as credito,
(select sum(l.valor)
from lancamento l
where l.conta_debito=c.codigo and
l.cod_emp=p.cod_emp and l.mes_ano_base=p.mes_ano_base and l.situacao=´1´) as debito
from lancamento p,plano c
where p.cod_emp=1 and p.cod_Emp=c.cod_emp and c.codigo=53
and p.mes_ano_base <´2004-10-01´

Ufa! até q enfim 8)
Vlw!


Responder

Gostei + 0

14/04/2005

Emerson Nascimento

tente assim:
select p.cod_emp, p.codigo,
  (select coalesce(sum(c.valor),0)
   from lancamento c
   where (c.cod_emp=p.cod_emp and c.conta_credito=p.codigo
      and c.mes_ano_base<´01.10.2004´ and c.situacao=1)) creditado,
  (select coalesce(sum(d.valor),0)
   from lancamento d
   where (d.cod_emp=p.cod_emp and d.conta_debito=p.codigo
      and d.mes_ano_base<´01.10.2004´ and d.situacao=1)) debitado
from plano p
where p.cod_emp=1
group by p.cod_emp, p.codigo
order by p.cod_emp, p.codigo


esse exemplo foi feito com o FB 1.5 (versões anteriores não possuem a função COALESCE())


Responder

Gostei + 0

14/04/2005

Emerson Nascimento

ou melhor:
select p.cod_emp, p.codigo,
  (select coalesce(sum(c.valor),0)
   from lancamento c
   where (c.cod_emp=p.cod_emp and c.conta_credito=p.codigo
      and c.mes_ano_base<´01.10.2004´ and c.situacao=1)) creditado,
  (select coalesce(sum(d.valor),0)
   from lancamento d
   where (d.cod_emp=p.cod_emp and d.conta_debito=p.codigo
      and d.mes_ano_base<´01.10.2004´ and d.situacao=1)) debitado
from plano p
where p.cod_emp=1
order by p.cod_emp, p.codigo


note que não é necessário o GROUP BY


Responder

Gostei + 0

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

Aceitar