Sql 执行百分比时被零除的错误(带日期参数的未联接表中的除数)

Sql 执行百分比时被零除的错误(带日期参数的未联接表中的除数),sql,sql-server,ssms,Sql,Sql Server,Ssms,我试图得到产品故障次数的百分比。 我在一个表中列出了故障,在另一个表中列出了吞吐量。吞吐量永远不能为0。如果报告为0,则永远不会运行该报告。 不幸的是,这些表无法联接。 我可以得到SQL中返回的正确结果,但是当我将查询应用到应用了日期参数的制造软件时,我收到了除以0的错误 查询在SQL中工作: SELECT CAST (COUNT (faulttype.faults) AS FLOAT)/ CAST ((SELECT COUNT(throughput.throughput) FROM [th

我试图得到产品故障次数的百分比。 我在一个表中列出了故障,在另一个表中列出了吞吐量。吞吐量永远不能为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'

我试过nullif,也试过case语句,但都没有用。由于缺少联接,Case语句不起作用。我设法把一些东西混在一起,以便案例陈述搜索ID计数为1,然后显示一个(它永远不会是)执行我的除法。我认为这会诱使SQL在用户应用日期参数之前看不到0。Buuut这不起作用,我相信有人会告诉我为什么lol。

奇怪的是你没有加入[Through] 表,但如果我接受您的查询,请尝试以下操作:

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

但是您正在比较两个查询之间的不同列,第一个是
throughput.throughput
,第二个是
faultype.regtime
?只需将其包装在一个大小写中,并在除数为0时返回0或null。它必须工作,向我们展示案例陈述和null(如果您尝试过)。旁注-除非您有意在每天的最后一分钟排除事件,否则请使用独占端点-
吞吐量<'20180814'
。您还将注意到,无论使用什么
datetime
数据类型(具有不同的精度可能性),独占端点总是正确的。
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