SQL查询运行提示"Divide by zero error encountered"错误排查求助
错误原因分析
- 报错
Divide by zero error encountered的核心触发逻辑:当DateExtended表中某一个TheDate日期对应的RAAudits表没有任何DateCompleted为当日的记录时,作为分母的子查询返回结果为0,SQL无法执行除以0的运算直接抛出错误。 - 额外说明:你在COUNT函数中使用的
COALESCE([ReviewID], 0)写法无效,COUNT函数统计时会自动忽略NULL值,没有符合条件的行时无论你是否做NULL替换,COUNT的返回结果都是0,无法避免除零场景。
修复方案
方案1:最小改动(仅加NULLIF避免除零)
使用NULLIF函数将分母为0的情况转换为NULL,SQL中除以NULL的结果为NULL,不会触发报错,你也可以额外加COALESCE将NULL结果转换为你需要的默认值(比如0)。
修改后的完整代码:
SELECT TheDate, 00 AS ReportID, (SELECT SiteID FROM LocalVariables) AS SiteID, (SELECT COUNT([ReviewID]) AS Expr1 FROM [RAAudits] WHERE CAST([DateCompleted] AS date) = DateExtended.TheDate AND pass = 1) * 100 / NULLIF((SELECT COUNT([ReviewID]) AS Expr2 FROM [RAAudits] WHERE CAST([DateCompleted] AS date) = DateExtended.TheDate), 0) AS DataValue FROM DateExtended WHERE TheDate BETWEEN (SELECT ServiceStartDate FROM LocalVariables) AND GETDATE() -1
如果需要将无记录时的NULL转换为0,可将计算DataValue的部分改为:COALESCE(上面的除法表达式, 0) AS DataValue
方案2:性能优化版(避免两次查询RAAudits表)
用LEFT JOIN+条件聚合的方式只查询一次RAAudits表,执行效率更高,同时天然避免除零问题:
SELECT de.TheDate, 00 AS ReportID, lv.SiteID, COALESCE(COUNT(CASE WHEN ra.pass = 1 THEN ra.ReviewID END) * 100.0 / NULLIF(COUNT(ra.ReviewID), 0), 0) AS DataValue FROM DateExtended de CROSS JOIN (SELECT SiteID, ServiceStartDate FROM LocalVariables) lv LEFT JOIN [RAAudits] ra ON CAST(ra.[DateCompleted] AS date) = de.TheDate WHERE de.TheDate BETWEEN lv.ServiceStartDate AND GETDATE() -1 GROUP BY de.TheDate, lv.SiteID
说明:这里乘以100.0是为了避免整数除法导致结果取整丢失小数位,如果不需要小数可以改回100。
内容的提问来源于stack exchange,提问作者Prashanthan Kailainathan
相关产品推荐
相关产品推荐

