首页 > 解决方案 > 执行百分比时除以零错误(带有日期参数的未连接表的除数)

问题描述

我试图获得产品出现故障的次数的百分比。我在一张表中有故障,在另一张表中有吞吐量。吞吐量永远不能为 0。如果为 0,则永远不会运行报告。不幸的是,无法连接表。我可以获得在 SQL 中返回的正确结果,但是当我将查询应用于应用了日期参数的制造软件时,我收到除以 0 错误。

在 SQL 中工作的查询:

SELECT  
CAST (COUNT (faulttype.faults) AS FLOAT)/
CAST ((SELECT COUNT(throughput.throughput)
FROM [throughput]
WHERE throughput.throughput   >= '2017-08-08 00:00:00' and throughput.throughput  <= '2018-08-13 23:59:00') 
AS FLOAT)
*100 Percentage

FROM faults (nolock)

INNER JOIN faulttype (nolock) ON faults = faults.faults

where fault.procedure = 15 
and  faults.regtime   >= '2017-08-08 00:00:00' and qc_inspections.regtime <= '2018-08-13 23:59:00'

应用日期参数的查询(收到除以 0 错误):

SELECT  
CAST (COUNT (faulttype.fault) AS FLOAT)/
CAST ((SELECT COUNT(throughput.throughput)
FROM [throughput]
WHERE CAST(faultype.regtime as date) between @datetimerange_From and @datetimerange_To
AS FLOAT)
  *100 Percentage

FROM faults (nolock)

   INNER JOIN faulttype (nolock) ON faults.id = faulttype.fault

   where fault.procedure = 15 
   and  CAST(faults.regtime as date) between @datetimerange_From and @datetimerange_To

我试过 nullif 和 case 语句都无济于事。由于缺少连接,案例语句不起作用。我设法捏造了一些东西,以便案例语句搜索 ID 计数为 1,然后显示一个(它永远不会),否则执行我的除法。我认为它会欺骗 SQL 在用户应用日期参数之前看不到 0。Buuuut 那没有用,我相信有人会告诉我为什么大声笑。

标签: sqlsql-serverssms

解决方案


奇怪的是,您没有加入 [吞吐量] 表,但如果我接受您的查询,请尝试这样的事情:

with CountFault as (
select count(throughput) CountFault 
from [throughput]
where  CAST(throughput as date) between @datetimerange_From and @datetimerange_To
)
select count(f2.fault as decimal) / nullif(f3.CountFault, 0) * 100
from faults f1
INNER JOIN faulttype f2 ON f1.id = f2.fault
cross join CountFault f3
where f1.procedure = 15 and  CAST(f1.regtime as date) between @datetimerange_From and @datetimerange_To

推荐阅读