none
Divisão por zero RRS feed

  • Pergunta

  • Bom dia,

    Galera!

    Estou precisando de uma ajuda na resolução desta Query, a mesma esta retornando a mensagem: Divide by zero error encountered.

    Não sei como tratar, tentei colocar o Case mas retonar a mesma mensagem, será que podem ajudar.

    Abs.

    Leandro Massena  

    Select 
      P.ProdCodEstr, 
      P.ProdNome ,
      Pum.ProdUnidMedCod,
      Sum(ELA.EstqLocArmazQtd) As EstqAtual,
      IP.InfProdQtdEstqMin As EstqMinimo,
      Sum((ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMin)*100) As PercMinimo,
      IP.InfProdQtdEstqMax As EstqMaximo,
      Case When Sum((ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMax)*100) = '0'
    Then 0
    Else
     Sum((ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMax)*100)
    End 

      From 
      Produto P 
      Join PROD_UNID_MED Pum ON P.ProdCodEstr = Pum.ProdCodEstr
      Join ESTQ_LOC_ARMAZ ELA ON ELA.ProdCodEstr = P.ProdCodEstr
      Left Join INFORM_PROD IP ON IP.ProdCodEstr = P.ProdCodEstr
      Where
    P.ProdCodEstr = '12.02.0016'
           And P.ProdGrupo = 'F'
           And P.ProdCtrlEstq = 'Sim'
           And  Pum.ProdUnidMedPos = '1'
           And  ELA.EmpCod = '1'
      
    Group By

      P.ProdCodEstr, 
      P.ProdNome ,
      Pum.ProdUnidMedCod,
      IP.InfProdQtdEstqMin,
      IP.InfProdQtdEstqMax

    quinta-feira, 3 de outubro de 2013 13:10

Respostas

  • Bom dia,

    Experimente dessa forma:

    Sum
        (case when IP.InfProdQtdEstqMin = 0 
             then 0
             else ELA.EstqLocArmazQtd / IP.InfProdQtdEstqMin * 100 end
        ) As PercMinimo,
    Sum
        (case when IP.InfProdQtdEstqMax = 0 
             then 0
             else ELA.EstqLocArmazQtd / IP.InfProdQtdEstqMax * 100 end 
        ) as PercMaximo

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta Leonardo N. D'Amato quinta-feira, 3 de outubro de 2013 13:25
    • Marcado como Resposta Giovani Cr quinta-feira, 3 de outubro de 2013 17:33
    quinta-feira, 3 de outubro de 2013 13:21
  • Leandro, o problema é que os campos que voce esta utilizando na divisão tem algum valor = 0, no case do jeito que esta não vai adiantar, por que voce esta dizendo que se o resultado da divisão for igual a zero, voce tem que colocar uma condição onde caso os campos que voce esta tentando dividir forem iguais a zero não dividir e colocar outro valor.

    Alexandre Matayosi Conde Mauricio.

    • Sugerido como Resposta Leonardo N. D'Amato quinta-feira, 3 de outubro de 2013 13:25
    • Marcado como Resposta Giovani Cr quinta-feira, 3 de outubro de 2013 17:33
    quinta-feira, 3 de outubro de 2013 13:22
  • Ele passar por essa linha corretamente? Pq nela n tem CASE:

    Sum((ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMin)*100) As PercMinimo,

    Cara, se o erro for na linha que tem o CASE, isso deve estar acontecendo pois um desses valores: ELA.EstqLocArmazQtd ou IP.InfProdQtdEstqMax é 0, isso está dentro do CASE, então mesmo assim ele tenta fazer uma divisão por zero, caso um desses seja = 0

    Tente mudar para: 

    CASE 
    WHEN ELA.EstqLocArmazQtd > 0 AND IP.InfProdQtdEstqMax > 0 
    THEN (ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMax)*100
    ELSE 0
    

    Isso deve te ajudar. Abraço


    Leonardo D'Amato

    • Sugerido como Resposta Leonardo N. D'Amato quinta-feira, 3 de outubro de 2013 13:26
    • Marcado como Resposta Giovani Cr quinta-feira, 3 de outubro de 2013 17:34
    quinta-feira, 3 de outubro de 2013 13:24

Todas as Respostas

  • Bom dia,

    Experimente dessa forma:

    Sum
        (case when IP.InfProdQtdEstqMin = 0 
             then 0
             else ELA.EstqLocArmazQtd / IP.InfProdQtdEstqMin * 100 end
        ) As PercMinimo,
    Sum
        (case when IP.InfProdQtdEstqMax = 0 
             then 0
             else ELA.EstqLocArmazQtd / IP.InfProdQtdEstqMax * 100 end 
        ) as PercMaximo

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta Leonardo N. D'Amato quinta-feira, 3 de outubro de 2013 13:25
    • Marcado como Resposta Giovani Cr quinta-feira, 3 de outubro de 2013 17:33
    quinta-feira, 3 de outubro de 2013 13:21
  • Leandro, o problema é que os campos que voce esta utilizando na divisão tem algum valor = 0, no case do jeito que esta não vai adiantar, por que voce esta dizendo que se o resultado da divisão for igual a zero, voce tem que colocar uma condição onde caso os campos que voce esta tentando dividir forem iguais a zero não dividir e colocar outro valor.

    Alexandre Matayosi Conde Mauricio.

    • Sugerido como Resposta Leonardo N. D'Amato quinta-feira, 3 de outubro de 2013 13:25
    • Marcado como Resposta Giovani Cr quinta-feira, 3 de outubro de 2013 17:33
    quinta-feira, 3 de outubro de 2013 13:22
  • Ele passar por essa linha corretamente? Pq nela n tem CASE:

    Sum((ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMin)*100) As PercMinimo,

    Cara, se o erro for na linha que tem o CASE, isso deve estar acontecendo pois um desses valores: ELA.EstqLocArmazQtd ou IP.InfProdQtdEstqMax é 0, isso está dentro do CASE, então mesmo assim ele tenta fazer uma divisão por zero, caso um desses seja = 0

    Tente mudar para: 

    CASE 
    WHEN ELA.EstqLocArmazQtd > 0 AND IP.InfProdQtdEstqMax > 0 
    THEN (ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMax)*100
    ELSE 0
    

    Isso deve te ajudar. Abraço


    Leonardo D'Amato

    • Sugerido como Resposta Leonardo N. D'Amato quinta-feira, 3 de outubro de 2013 13:26
    • Marcado como Resposta Giovani Cr quinta-feira, 3 de outubro de 2013 17:34
    quinta-feira, 3 de outubro de 2013 13:24
  • Galera, fiz da formar sugerida e agora esta retornando resultado, obrigado pela ajuda.

    abs,

    Leandro Massena

    quinta-feira, 3 de outubro de 2013 13:51
  • Select 
      P.ProdCodEstr, 
      P.ProdNome ,
      Pum.ProdUnidMedCod,
      Sum(ELA.EstqLocArmazQtd) As EstqAtual,
      IP.InfProdQtdEstqMin As EstqMinimo,
      Case When IP.InfProdQtdEstqMin <> 0 Then Sum((ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMin)*100) Else 0 End As PercMinimo,
      IP.InfProdQtdEstqMax As EstqMaximo,
      Case When IP.InfProdQtdEstqMax <> 0 Then Sum((ELA.EstqLocArmazQtd/IP.InfProdQtdEstqMax)*100) Else 0 End
    
      From 
      Produto P 
      Join PROD_UNID_MED Pum ON P.ProdCodEstr = Pum.ProdCodEstr
      Join ESTQ_LOC_ARMAZ ELA ON ELA.ProdCodEstr = P.ProdCodEstr
      Left Join INFORM_PROD IP ON IP.ProdCodEstr = P.ProdCodEstr
      Where  
    P.ProdCodEstr = '12.02.0016'
           And P.ProdGrupo = 'F'
           And P.ProdCtrlEstq = 'Sim'
           And  Pum.ProdUnidMedPos = '1'
           And  ELA.EmpCod = '1'
      
    Group By
    
      P.ProdCodEstr, 
      P.ProdNome ,
      Pum.ProdUnidMedCod,
      IP.InfProdQtdEstqMin,
      IP.InfProdQtdEstqMax

    Dessa forma deve funcionar.

    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    quinta-feira, 3 de outubro de 2013 13:56
  • Deleted
    quinta-feira, 3 de outubro de 2013 21:06
  • Obrigado José, alterei a consulta da forma que você indicou e também foi satisfatório, obrigado pela dica.

    sexta-feira, 4 de outubro de 2013 12:09