Case when com top 1

27/03/2006

0

Olá!

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

Marciacrystal

Responder

Posts

28/03/2006

Wcrivelini

marcia

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


Responder

28/03/2006

Marciacrystal

Olá Wagner,

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


Responder

28/03/2006

Marciacrystal

Olá Wagner,

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


Responder

28/03/2006

Emerson Nascimento

veja se assim funciona:
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)



Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar