none
Dividir 0 / 0 ? RRS feed

  • Pergunta

  • Boa noite pessoal ?

    Tenho um procedimento que faz diversos calculos incluindo dividir ou seja soma varias variaveis e depois dividi por um resultado de uma outra soma

    Mas acontece as vezes a soma dos resultados vai ser Zero a teria que dividir pela soma do segundo resulta que tbm vai ser zero .

    Alguma sugestao para resolver esse problema ?

    DECLARE @MES_ATUAL INT = (SELECT DATEPART(MM,GETDATE()))
    DECLARE @ANO_ATUAL INT = (SELECT DATEPART(YY,GETDATE()))
    DECLARE @DATA_DIA_ANTERIOR DATETIME  =(SELECT CAST(CONVERT(VARCHAR,GETDATE() - 2,101) AS DATETIME))
    DECLARE @DATA_ACUM_MES DATETIME = (SELECT CONVERT(VARCHAR(4),@ANO_ATUAL) + '-'+ '01-'+ CONVERT(VARCHAR(2), @MES_ATUAL))
    DECLARE @TB TABLE ( EQUIPAMENTO VARCHAR(30),HR_MANUTENCAO TIME, HR_REQUERIDA TIME,DATA DATETIME)
    
    INSERT INTO @TB VALUES  ('FUSCA','05:00:00','10:00:00','20120828 00:00:00')
    INSERT INTO @TB VALUES  ('GOL','00:00:00','00:00:00','20120828 00:00:00')SELECT DISTINCT  T1.EQUIPAMENTO,  DISP_DIA_ANTERIOR = IsNull(T2.DISP_DIA_ANTERIOR, 100),  ACUM_MES          = IsNull(T3.ACUM_MES, 100)FROM  @TB T1 Left Join (Select                      EQUIPAMENTO,					  DISP_DIA_ANTERIOR = 100 - (Convert(Decimal(15,2), Convert(Float, ((DatePart(hh, HR_MANUTENCAO) * 60) + (DatePart(mi, HR_MANUTENCAO)))) /                                                                        Convert(Float, ((DatePart(hh, HR_REQUERIDA)  * 60) + (DatePart(mi, HR_REQUERIDA))))) * 100)                    FROM					  @TB					WHERE					  (DATA = @DATA_DIA_ANTERIOR)) T2 on (T2.EQUIPAMENTO = T1.EQUIPAMENTO)         Left Join (Select                      EQUIPAMENTO,					  ACUM_MES = 100 - (Convert(Decimal(15,2), SUM(Convert(Float, ((DatePart(hh, HR_MANUTENCAO) * 60) + (DatePart(mi, HR_MANUTENCAO))))) /                                                               SUM(Convert(Float, ((DatePart(hh, HR_REQUERIDA)  * 60) + (DatePart(mi, HR_REQUERIDA)))))) * 100)                    FROM					  @TB					WHERE					  (DATA > @DATA_ACUM_MES)					GROUP BY					  EQUIPAMENTO) T3 on (T3.EQUIPAMENTO = T1.EQUIPAMENTO)

    Obrigado!

    segunda-feira, 3 de setembro de 2012 20:40

Respostas

  • Costuma-se usar o Case pra isso.

    Assim você diz: Caso o divisor seja zero, acontece tal coisa. Do contrário, acontece a divisão normalmente.

    Exemplo:

    ...
      Campo = Case
                When (10 - 4 + 2 - 8) = 0 Then
                  0
                Else
                  30 / (10 - 4 + 2 - 8)
              End

    Neste exemplo o divisor foi

    (10 - 4 + 2 - 8)

    e queríamos, antes da divisão, verificar se o resultado desta fórmula não seria zero.

    Quando a fórmula é muito grande também costuma-se calculá-la jogando seu resultado para uma tabela temporária. Assim, nesta nova tabela, você teria tanto o divisor quanto o dividendo. Aí fica mais fácil fazer a divisão com a proteção de divisão por zero.

    Mas nem sempre é possível jogar para uma tabela temporária.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Roberson Naves terça-feira, 4 de setembro de 2012 13:06
    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    segunda-feira, 3 de setembro de 2012 23:55
    Moderador
  • Como não é possivel fazer divisão por zero, voce pode colocar uma condição onde as suas somas forem diferentes de zero.

    Alexandre Matayosi.

    • Sugerido como Resposta Alexandre Matayosi terça-feira, 4 de setembro de 2012 14:36
    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    terça-feira, 4 de setembro de 2012 14:35
  • Boa Noite,

    Eu vou na linha do Roberson. O ideal é que sua consulta possa prever esses casos e faça as devidas adaptações.
    Independente disso, há um atalho caso você não possa reescrever, mas ainda assim recomendo fortemente que o faça.

    select 0 / 0 -- Dá erro

    -- Muda as opções de sessão
    SET ANSI_WARNINGS OFF
    SET ARITHABORT OFF
    SET ARITHIGNORE OFF

    select 0 / 0 -- Retorna nulo
    select ISNULL(2/0,0) -- Converte as divisões por zero para zero

    Esse script mostra uma opção, mas tenha cuidado, pois, você não saberá os valores nulos são resultado de uma divisão por zero ou por outros valores nulos

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 5 de setembro de 2012 00:56
    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    quarta-feira, 5 de setembro de 2012 00:56

Todas as Respostas

  • Costuma-se usar o Case pra isso.

    Assim você diz: Caso o divisor seja zero, acontece tal coisa. Do contrário, acontece a divisão normalmente.

    Exemplo:

    ...
      Campo = Case
                When (10 - 4 + 2 - 8) = 0 Then
                  0
                Else
                  30 / (10 - 4 + 2 - 8)
              End

    Neste exemplo o divisor foi

    (10 - 4 + 2 - 8)

    e queríamos, antes da divisão, verificar se o resultado desta fórmula não seria zero.

    Quando a fórmula é muito grande também costuma-se calculá-la jogando seu resultado para uma tabela temporária. Assim, nesta nova tabela, você teria tanto o divisor quanto o dividendo. Aí fica mais fácil fazer a divisão com a proteção de divisão por zero.

    Mas nem sempre é possível jogar para uma tabela temporária.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Roberson Naves terça-feira, 4 de setembro de 2012 13:06
    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    segunda-feira, 3 de setembro de 2012 23:55
    Moderador
  • Como não é possivel fazer divisão por zero, voce pode colocar uma condição onde as suas somas forem diferentes de zero.

    Alexandre Matayosi.

    • Sugerido como Resposta Alexandre Matayosi terça-feira, 4 de setembro de 2012 14:36
    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    terça-feira, 4 de setembro de 2012 14:35
  • Boa Noite,

    Eu vou na linha do Roberson. O ideal é que sua consulta possa prever esses casos e faça as devidas adaptações.
    Independente disso, há um atalho caso você não possa reescrever, mas ainda assim recomendo fortemente que o faça.

    select 0 / 0 -- Dá erro

    -- Muda as opções de sessão
    SET ANSI_WARNINGS OFF
    SET ARITHABORT OFF
    SET ARITHIGNORE OFF

    select 0 / 0 -- Retorna nulo
    select ISNULL(2/0,0) -- Converte as divisões por zero para zero

    Esse script mostra uma opção, mas tenha cuidado, pois, você não saberá os valores nulos são resultado de uma divisão por zero ou por outros valores nulos

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 5 de setembro de 2012 00:56
    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    quarta-feira, 5 de setembro de 2012 00:56