Case when com top 1
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
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
Curtidas 0
Respostas
Wcrivelini
27/03/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
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
GOSTEI 0
Marciacrystal
27/03/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
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
GOSTEI 0
Marciacrystal
27/03/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
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
GOSTEI 0
Emerson Nascimento
27/03/2006
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)
GOSTEI 0