isnull retorna errado quando uso where
olá pessoal... estou com problemas numa query... não consigo entender
retorna:
cod tot
0 1
1 1
101 1008
102 40
999 1
se eu usar a clausula where:
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.
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:
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.
Brainrj
Curtidas 0
Respostas
Emerson Nascimento
01/09/2009
só pra desencargo de consciência, faça o teste com a instrução abaixo (com e sem o where):
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
GOSTEI 0
Brainrj
01/09/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:
query completa:
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
GOSTEI 0
Emerson Nascimento
01/09/2009
veja se assim funciona:
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.
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.
GOSTEI 0
Brainrj
01/09/2009
acho que assim vai funcionar so precisei remover
pq essa query eu replico ela dentro do delphy pra puxar os 12 meses anteriores.
vou testar aqui e depois posto o resultado
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
GOSTEI 0
Brainrj
01/09/2009
problema resolvido.. vlw pela ajuda...
GOSTEI 0