SQL Server除以零错误遇到COALESCE()

时间:2015-01-14 10:03:43

标签: sql sql-server-2008

我有以下语句,即使使用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)

4 个答案:

答案 0 :(得分:1)

当SUN获得ZERO时。它将被ZERO分割。 试试这个......

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)

SQL Fiddle

答案 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