isnull retorna errado quando uso where
01/09/2009
0
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
Posts
01/09/2009
Emerson Nascimento
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
01/09/2009
Brainrj
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
01/09/2009
Emerson Nascimento
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.
01/09/2009
Brainrj
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
Clique aqui para fazer login e interagir na Comunidade :)