我正在处理一些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'
答案 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
。这似乎是一个很小的更改,但是我想这是您想要从计算中获得的结果,而不是您想要进行计算的类型。