Ir para conteúdo
  • Cadastre-se

dev botao

Case não considera campo double precision


  • Este tópico foi criado há 2429 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Pessoal, 

Tenho este sql abaixo, onde o campo VLTOTALBRUTO esta dando erro de arithimetic por estar zerado em alguns casos. 
Tentei usar um case para tratar quando for zero nao executar a sentensa do cast, porem ele nao passa pelo case. Ele deveria jogar para a variavel vltotal = 0 qdo o vltotalbruto for 0, caso contrario executar executar o cast, mas mesmo usando o case ele da erro de arithimetic 

SELECT p.cnpj_cpf, SUBSTRING(p.insc_rg FROM 1 FOR 14), p.tpinsc, m.dataemissao, 
nf.uf, cast(lpad (m.numdocumento, 6, '0') as varchar(06)), 
mi.percicms as aliquota, 
Case When m.vltotalbruto = 0 then 0 
else 
CAST((sum((mi.qtde * mi.vlunitario) + coalesce(mi.vlipi, 0) + 
((mi.qtde * mi.vlunitario)*(((coalesce(nf.vloutrasdespesas,0) * 100) / m.vltotalbruto) / 100)) + 
((mi.qtde * mi.vlunitario)*(((coalesce(nf.vlseguro,0) * 100) / m.vltotalbruto) / 100)) + 
((mi.qtde * mi.vlunitario)*(((coalesce(m.vlfrete,0) * 100) / m.vltotalbruto) / 100)) + 
coalesce(mi.valoricmsst, 0) - coalesce(mi.vldesconto, 0))) AS NUMERIC(11,2)) end as vltotal, 
CAST((sum((coalesce(mi.baseicms, 0)))) AS NUMERIC(11,2)) as baseicms, 
CAST((sum(mi.vlicms)) AS NUMERIC(11,2)) as vlicms, 
m.situacao, SUBSTRING(nf.modelo from 1 for 2), mi.cfop 
FROM mov_movimento m 
JOIN mov_nf nf on (m.cod= nf.cod) 
JOIN pes_pessoas p on (m.codclifor = p.cod) 
join g_tpmovimento tp on (m.codtpmovimento = tp.cod) 
join mov_movitens mi on (m.cod = mi.codmovimento) 
WHERE m.dataemissao >= :INICIO AND m.dataemissao <= :fim and m.codempresa = :codempresa 
GROUP BY p.cnpj_cpf, p.insc_rg, p.tpinsc, m.dataemissao, nf.uf, m.numdocumento, 
mi.percicms, m.situacao, nf.modelo,mi.cfop, m.vltotalbruto

Link para o comentário
Compartilhar em outros sites

Paulo consegui resolver é bem simples, mas nao vi em lugar nenhum explicando que o cast ou o sum tem que ficar fora do case

CAST(sum(
             case
                when m.vltotalbruto = 0 then 0
                when m.vltotalbruto < 0 then 0
             else
                ((mi.qtde * mi.vlunitario) + coalesce(mi.vlipi, 0) +
                ((mi.qtde * mi.vlunitario)*(((coalesce(nf.vloutrasdespesas,0) * 100) / m.vltotalbruto) / 100)) +
                ((mi.qtde * mi.vlunitario)*(((coalesce(nf.vlseguro,0) * 100) / m.vltotalbruto) / 100)) +
                ((mi.qtde * mi.vlunitario)*(((coalesce(m.vlfrete,0) * 100) / m.vltotalbruto) / 100)) +
                coalesce(mi.valoricmsst, 0) - coalesce(mi.vldesconto, 0))
             end) AS NUMERIC(11,2)) as vltotal,

pronto resolvido

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2429 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.