Case when com top 1
27/03/2006
0
Preciso de uma ajuda, como faço para dar um sum em uma sub query com top 1.
Com esse select esta me trazendo os dados mas sepados por registro. O que quero é um somatório geral.
Select (case when (select top 1 r.vlsaldotitulo) > 0 then (select top 1 r.vlsaldotitulo) else t.vlatual end)
from recebimento r
inner join tituloareceber t on t.idtituloareceber = r.idtituloareceber
where r.dtbaixa <=´31/01/2004´ and T.idFilial = 53
Group by r.vlsaldotitulo,r.dtbaixa, r.idrecebimento,t.vlatual
order by r.dtbaixa desc, r.idrecebimento desc
Se alguém tiver alguma dica...
Márcia
Marciacrystal
Posts
28/03/2006
Wcrivelini
tenho mais perguntas do que respostas, mas vamos tentar.
em primeiro lugar, se vc deseja um somatório GERAL das transações da filial 53 anteriores a 31/01/2004, não pode haver GROUP BY ou ORDER BY na sua declaração SQL.
em segundo lugar, não entendi por que vc colocou a subquery com TOP 1, se na verdade na está selecionando nada diferente na subquery. e confesso q a sintaxe me pareceu um pouco confusa, não sei se irá rodar deste jeito.
por fim, não vi onde vc pretende fazer o SUM, mas suponho que seja a somatória do resultado do CASE. neste caso, eu sugiro tentar a seguinte declaração:
SELECT SUM( CASE WHEN r.vlsaldotitulo >0 THEN r.vlsaldotitulo ELSE t.vlatual END) AS TOTALGERAL
FROM recebimento r
INNER JOIN tituloareceber t ON t.idtituloareceber = r.idtituloareceber
WHERE r.dtbaixa <=´31/01/2004´ and T.idFilial = 53
[]s
wagner
28/03/2006
Marciacrystal
Deixa eu tentar te explicar:
Preciso do valor total de inadimplencia de uma filial até um certo período, o campo vlsaldotitulo vem sendo composto apartir da primeira baixa(vloriginal-vlbaixa) na sequencia (vlsaldotitulo-vlbaixa), o top 1 com order by em dtbaixa desc e idrecebimento desc é para pegar o ultimo lancamento menor ou igual aquela data.
Montei outra query, que esta me trazendo o resultado, se vc quiser dar uma olhada e se tiver como otimizar e quiser me passar fico grata.
set dateformat dmy
select sum(vlsaldo)
from (
Select isnull((select top 1 r.vlsaldotitulo
from recebimento r
where r.idtituloareceber = t.idtituloareceber
and r.dtbaixa <´29/03/2006´ and t.idfilial = 53
order by r.dtbaixa desc, r.idrecebimento desc),t.vlatual) as vlsaldo
From tituloareceber t inner join Filial f on f.idfilial = t.idfilial
where t.dtvencimento <´29/03/2006´
and t.tpstatus <>´3´ and t.vlatual > 0 and t.idfilial = 53)as tabela
Um abraço
Márcia
28/03/2006
Marciacrystal
Deixa eu tentar te explicar:
Preciso do valor total de inadimplencia de uma filial até um certo período, o campo vlsaldotitulo vem sendo composto apartir da primeira baixa(vloriginal-vlbaixa) na sequencia (vlsaldotitulo-vlbaixa), o top 1 com order by em dtbaixa desc e idrecebimento desc é para pegar o ultimo lancamento menor ou igual aquela data.
Montei outra query, que esta me trazendo o resultado, se vc quiser dar uma olhada e se tiver como otimizar e quiser me passar fico grata.
set dateformat dmy
select sum(vlsaldo)
from (
Select isnull((select top 1 r.vlsaldotitulo
from recebimento r
where r.idtituloareceber = t.idtituloareceber
and r.dtbaixa <´29/03/2006´ and t.idfilial = 53
order by r.dtbaixa desc, r.idrecebimento desc),t.vlatual) as vlsaldo
From tituloareceber t inner join Filial f on f.idfilial = t.idfilial
where t.dtvencimento <´29/03/2006´
and t.tpstatus <>´3´ and t.vlatual > 0 and t.idfilial = 53)as tabela
Um abraço
Márcia
28/03/2006
Emerson Nascimento
select isnull(sum(r.vsaldotitulo),0) from recebimento r inner join tituloareceber t on (t.idtituloareceber = r.idtituloareceber) where t.idfilial = 53 and t.tpstatus <> ´3´ and t.dtvencimento < ´29/03/2006´ and t.vlatual > 0 and r.idrecebimento = (select max(r2.idrecebimento) from recebimento r2 where r2.dtbaixa < ´29/03/2006´ and r2.idtituloareceber = r.idtituloareceber)
Clique aqui para fazer login e interagir na Comunidade :)