Array
(
)

isnull retorna errado quando uso where

Brainrj
   - 01 set 2009

olá pessoal... estou com problemas numa query... não consigo entender

#Códigoselect cod,
(select isnull(sum(vlrprest),1) from prestacoes p where p.codloja=l.cod and MONTH(dtvenc)=@m10 and year(dtvenc)=@a10)tot
from lojas l

retorna:
cod tot
0 1
1 1
101 1008
102 40
999 1

se eu usar a clausula where:

#Códigoselect cod,
(select isnull(sum(vlrprest),1) from prestacoes p where p.codloja=l.cod and MONTH(dtvenc)=@m10 and year(dtvenc)=@a10)tot
from lojas l where cod = 0

retorna:
cod tot
0 0

tot era pra retornar 1 pois esse codigo faz parte de uma query onde o resultado da consulta eu uso como divisor... e ele retornando zero da erro ao dividir por zero.

Emerson
   - 01 set 2009

só pra desencargo de consciência, faça o teste com a instrução abaixo (com e sem o where):
#Códigoselect
l.cod, isnull(sum(p.vlrprest),1) tot
from
lojas l
left join prestacoes p
on p.codloja=l.cod and MONTH(p.dtvenc)=@m10 and year(p.dtvenc)=@a10)
where
l.cod = 0
group by
l.cod


Brainrj
   - 01 set 2009

assim funcionou... saberia me explicar o motivo de um jeito funcionar e outro não? pois eu não sei se vou conseguir aplicar a forma que voce desenvolvel na minha query... pois ela faz parte de uma query maior...

query completa:
#Códigoselect cod,

isnull(((((select isnull(sum(vlrprest),0) from prestacoes p where l.cod=p.codloja and MONTH(dtvenc)=@m1 and year(dtvenc)=@a1
and dtvenc < CONVERT(CHAR(10),GETDATE(),102) and (dtpagto is null or MONTH(dtpagto)<>@m1 or year(dtpagto)<>@a1))-

(select ISNULL(sum(vlrjuros)+sum(vlrmulta),0) from prestacoes p where l.cod=p.codloja and MONTH(dtpagto)=@m1 and year(dtpagto)=@a1
and (dtpagto is not null and vlrpago is not null)))*100)/

(select isnull(sum(vlrprest),1) from prestacoes p where l.cod=p.codloja and MONTH(dtvenc)=@m1 and year(dtvenc)=@a1)),0)perc_inadimplencia

from lojas l


Emerson
   - 01 set 2009

veja se assim funciona:
#Códigoselect
cod,

(
( sum( case when MONTH(p.dtvenc)=@m1 and year(p.dtvenc)=@a1
and p.dtvenc < CONVERT(CHAR(10),GETDATE(),102)
and (p.dtpagto is null or MONTH(p.dtpagto)<>@m1 or year(p.dtpagto)<>@a1)
then p.vlrprest
else 0
end
) -
sum( case when MONTH(p.dtpagto)=@m1 and year(p.dtpagto)=@a1 and not p.vlrpago is null
then coalesce(p.vlrjuros, 0) + coalesce(p.vlrmulta, 0)
else 0
end
)
) * 100
) /

isnull( sum( case when MONTH(p.dtvenc)=@m1 and year(p.dtvenc)=@a1
then p.vlrprest
else null
end
), 1
)
from
lojas l
left join prestacoes p
on p.codloja=l.cod and ( (MONTH(p.dtvenc)=@m1 and year(p.dtvenc)=@a1) or
(MONTH(p.dtpagto)=@m1 and year(p.dtpagto)=@a1) )
group by
l.cod


note que a instrução parece mais complexa, porém o relacionamento será feito apenas 1 vez, contra ao menos 3 vezes na outra instrucao. isso deve aumentar a performance.

Brainrj
   - 01 set 2009

acho que assim vai funcionar so precisei remover

#Códigoand ( (MONTH(p.dtvenc)=@m1 and year(p.dtvenc)=@a1) or
(MONTH(p.dtpagto)=@m1 and year(p.dtpagto)=@a1) )


pq essa query eu replico ela dentro do delphy pra puxar os 12 meses anteriores.

vou testar aqui e depois posto o resultado

Brainrj
   - 09 set 2009

problema resolvido.. vlw pela ajuda...