如何解决“除以零”错误

时间:2018-12-06 11:39:46

标签: sql

我正在处理一些SQL查询,但是抛出错误:

除以零错误。

我相信这是造成此问题的原因:

select DataDoc as Data,
numdoc as NºDoc, cabeccompras.Matricula As Matricula,CDU_PesoBrtTotDoc as PesoBruto, CDU_PesoLiqTotDoc as PesoLiquido, 
CDU_VolumeTotlDoc as VolumeTotal, Viaturas.CDU_CapacidadeM3 as CapacidadeCamião,(CDU_VolumeTotlDoc - Viaturas.CDU_CapacidadeM3) AS [Vazio], 
convert(nvarchar,CAST(100 -(cast(cdu_volumetotldoc as decimal(12,2) ) * 100 / cast(Viaturas.CDU_CapacidadeM3 as decimal(12,2))) AS DECIMAL (12,2))) + '%' AS "Percentagem Vazio",Viaturas.CDU_TipoViat as Tipo_Viatura
from CabecCompras
inner join viaturas on CabecCompras.matricula=Viaturas.matricula
where tipodoc='VGR'

2 个答案:

答案 0 :(得分:0)

您可以在下面使用NULLIF()函数

select DataDoc as Data,
numdoc as NºDoc, cabeccompras.Matricula As Matricula,CDU_PesoBrtTotDoc as PesoBruto, CDU_PesoLiqTotDoc as PesoLiquido, 
CDU_VolumeTotlDoc as VolumeTotal, Viaturas.CDU_CapacidadeM3 as CapacidadeCamião,(CDU_VolumeTotlDoc - Viaturas.CDU_CapacidadeM3) AS [Vazio], 
convert(nvarchar,CAST(100 -(cast(cdu_volumetotldoc as decimal(12,2) ) * 100 / nullif(cast(Viaturas.CDU_CapacidadeM3 as decimal(12,2))) AS DECIMAL (12,2))),0) + '%' AS "Percentagem Vazio",
Viaturas.CDU_TipoViat as Tipo_Viatura
from CabecCompras
inner join viaturas on CabecCompras.matricula=Viaturas.matricula
where tipodoc='VGR'

答案 1 :(得分:0)

您的问题的答案是使用nullif()。但是,切勿使用没有长度的varchar和相关类型。默认长度因上下文而异(在SQL Server中),并且错误的长度会引入难以调试的错误。

所以,而不是:

convert(nvarchar,CAST(100 -(cast(cdu_volumetotldoc as decimal(12,2) ) * 100 / cast(Viaturas.CDU_CapacidadeM3 as decimal(12,2))) AS DECIMAL (12,2))) + '%' AS "Percentagem Vazio",Viaturas.CDU_TipoViat as Tipo_Viatura

您大概想要:

convert(nvarchar(255),
        convert(decimal(12, 2),
                (100.0 - cdu_volumetotldoc) / nullif(CDU_CapacidadeM3, 0)
               )
        ) + '%' AS [Percentagem Vazio],

请注意,这会在除法之后转换为decimal 。这似乎是一个很小的更改,但是我想这是您想要从计算中获得的结果,而不是您想要进行计算的类型。