Array
(
)

Case when com top 1

Marciacrystal
   - 27 mar 2006

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

Wcrivelini
   - 28 mar 2006

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

Marciacrystal
   - 28 mar 2006

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

Marciacrystal
   - 28 mar 2006

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

Emerson
   - 28 mar 2006

veja se assim funciona:
#Código

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)