SQL 服务器遇到除零错误 COALESCE()
SQL Server Divide by zero error encountered COALESCE()
我有以下语句,即使在使用合并表达式时仍然返回被零除错误。
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 0 end)AS FLOAT) / CAST(sum(case when W0.i13 <> 0 then 1 else 0 end) AS FLOAT),0)
Msg 8134, Level 16, State 1, Line 1 Divide by zero error encountered.
我也试了下面的,还是报错
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 0 end)AS FLOAT),0) / COALESCE(CAST(sum(case when W0.i13 <> 0 then 1 else 0 end) AS FLOAT),0)
在合并函数 0/0 中将 0 替换为 1 将得到 error:Divide 遇到的零错误。
在 "case when W0.i13 = 1 then 1 else 0 end)AS FLOAT" 语句中,当其输出为 0 时,它不会在合并中使用第二个参数,因此最好将 ) 替换为其他函数。到那时它会给出错误。最好放其他号码
它会起作用
更改为
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 2 end)AS FLOAT),1) / COALESCE(CAST(sum(case when W0.i13 <> 0 then 1 else 2 end) AS FLOAT),1)
当太阳归零时。它将除以零。
试试这个...
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 0 end)AS FLOAT),1) / COALESCE(CAST((case when sum(case when W0.i13 <> 0 then 1 else 0 end) = 0 then 1 else sum(case when W0.i13 <> 0 then 1 else 0 end) end) AS FLOAT),1)
正如 CoderOfCode 在评论中指出的那样 - 您使用 0 作为 COALESCE 的第二个参数而不是 1。但是您真正的问题是除数中的 SUM
给出 0,并且 COALESCE 会很乐意使用那(因为 0 != NULL)。
您应该能够在除数部分使用 COALESCE / NULL
的组合来强制 COALESCE 使用其第二个参数,从而避免除以 0:
CAST(
sum(
case
when W0.i13 = 1 then 1
else 0
end)
AS FLOAT) /
COALESCE(
CAST(
sum(
case
when W0.i13 <> 0 then 1
else NULL end)
AS FLOAT),
1)
请尝试以下
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 0 end)AS FLOAT) / CAST(sum(case when W0.i13 <> 0 then W0.i13 else 1 end) AS FLOAT),0)
这里可能的罪魁祸首是 CAST(sum(case when W0.i13 <> 0 then 1 else 0 end) AS FLOAT)
因为
如果 W0.i13 <> 0 成立则它 returns 0
我有以下语句,即使在使用合并表达式时仍然返回被零除错误。
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 0 end)AS FLOAT) / CAST(sum(case when W0.i13 <> 0 then 1 else 0 end) AS FLOAT),0)
Msg 8134, Level 16, State 1, Line 1 Divide by zero error encountered.
我也试了下面的,还是报错
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 0 end)AS FLOAT),0) / COALESCE(CAST(sum(case when W0.i13 <> 0 then 1 else 0 end) AS FLOAT),0)
在合并函数 0/0 中将 0 替换为 1 将得到 error:Divide 遇到的零错误。
在 "case when W0.i13 = 1 then 1 else 0 end)AS FLOAT" 语句中,当其输出为 0 时,它不会在合并中使用第二个参数,因此最好将 ) 替换为其他函数。到那时它会给出错误。最好放其他号码
它会起作用
更改为
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 2 end)AS FLOAT),1) / COALESCE(CAST(sum(case when W0.i13 <> 0 then 1 else 2 end) AS FLOAT),1)
当太阳归零时。它将除以零。 试试这个...
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 0 end)AS FLOAT),1) / COALESCE(CAST((case when sum(case when W0.i13 <> 0 then 1 else 0 end) = 0 then 1 else sum(case when W0.i13 <> 0 then 1 else 0 end) end) AS FLOAT),1)
正如 CoderOfCode 在评论中指出的那样 - 您使用 0 作为 COALESCE 的第二个参数而不是 1。但是您真正的问题是除数中的 SUM
给出 0,并且 COALESCE 会很乐意使用那(因为 0 != NULL)。
您应该能够在除数部分使用 COALESCE / NULL
的组合来强制 COALESCE 使用其第二个参数,从而避免除以 0:
CAST(
sum(
case
when W0.i13 = 1 then 1
else 0
end)
AS FLOAT) /
COALESCE(
CAST(
sum(
case
when W0.i13 <> 0 then 1
else NULL end)
AS FLOAT),
1)
请尝试以下
COALESCE(CAST(sum(case when W0.i13 = 1 then 1 else 0 end)AS FLOAT) / CAST(sum(case when W0.i13 <> 0 then W0.i13 else 1 end) AS FLOAT),0)
这里可能的罪魁祸首是 CAST(sum(case when W0.i13 <> 0 then 1 else 0 end) AS FLOAT)
因为
如果 W0.i13 <> 0 成立则它 returns 0