Usuário com melhor resposta
Dividir 0 / 0 ?

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!
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.brSe 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
-
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
-
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 OFFselect 0 / 0 -- Retorna nulo
select ISNULL(2/0,0) -- Converte as divisões por zero para zeroEsse 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/gmasqlClassifique 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
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.brSe 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
-
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
-
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 OFFselect 0 / 0 -- Retorna nulo
select ISNULL(2/0,0) -- Converte as divisões por zero para zeroEsse 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/gmasqlClassifique 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