计算布尔值平均值:SQL正常运行时间占比代码编译失败求助
解决SQL计算正常运行时间相对故障停机时间占比的问题
原代码存在的问题
- 两次扫描数据表,查询效率较低
- 若未显式触发浮点运算,可能出现整数除法导致的精度丢失(虽用float变量缓解,但仍有优化空间)
- 多余的SET语句可能掩盖潜在错误,不利于问题排查
优化后的SQL代码
SELECT COUNT(CASE WHEN Status = 1 THEN 1 END) AS UptimeCount, COUNT(CASE WHEN Status = 0 THEN 1 END) AS DowntimeCount, CASE WHEN COUNT(CASE WHEN Status = 0 THEN 1 END) = 0 THEN 100 ELSE COUNT(CASE WHEN Status = 1 THEN 1 END) * 100.0 / COUNT(CASE WHEN Status = 0 THEN 1 END) END AS UptimeVsDowntimeRatio FROM dbo.[Uptimes]
代码说明
- 仅扫描一次数据表即可完成所有统计,显著提升查询效率
- 使用
COUNT(CASE ...)直接统计对应状态的记录数,逻辑直观清晰 - 用
100.0触发浮点运算,确保计算结果的精度 - 提前处理故障记录数为0的边界情况,避免除数为0的运行错误
排查编译问题的建议
- 确认表名
dbo.[Uptimes]拼写正确,目标数据表确实存在 - 确认
Status列存在且数据类型为整数或bit(bit类型判断Status=1/0同样有效) - 移除
SET ARITHABORT OFF;和SET ANSI_WARNINGS OFF;,开启默认设置有助于暴露潜在的语法或逻辑错误
内容的提问来源于stack exchange,提问作者Rahbit
相关产品推荐
相关产品推荐

