Array
(
)

isnull retorna errado quando uso where

Brainrj
   - 01 set 2009

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

#Código

select 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ódigo
select 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ódigo

select
  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ódigo

select 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ódigo

select
  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ódigo

and ( (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...