我有以下语句,即使使用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除以零错误。
我也尝试了以下内容并仍然收到错误
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 :(得分: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)
答案 1 :(得分: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)
答案 2 :(得分:0)
在合并函数0/0中将0替换为1将给出错误:遇到零除错误。
在&#34;情况下,当W0.i13 = 1然后1,否则0结束)AS FLOAT&#34;声明当它的输出为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)
答案 3 :(得分:0)
请尝试以下
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&lt;&gt; 0保持为false然后返回0