2015-01-14 43 views
0

即使在使用合併表達式時,我仍有下列聲明仍然返回除零錯誤。SQL Server除以零錯誤遇到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是'COALESCE' –

+2

@CoderofCode雖然這是真的你的默認值,它不是的原因問題。如果第一個參數爲零,COALESCE會高興地返回0 - 無論您將其作爲第二個參數。 –

回答

0

在COALESCE函數0/0用1替換0會給錯誤:遇到的零誤差鴻溝。

在「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) 
+0

嗨Koushik,我試過了,仍然返回相同的錯誤 –

+0

editted檢查它 –

1

當SUM越來越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

由於CoderOfCode在評論中指出 - 你正在使用0作爲第二個參數凝聚,而不是1。但是你真正的問題是,在除數SUM給出0, COALESCE會很高興地使用它(因爲0!= NULL)。

您應該能夠使用的COALESCE/NULL組合在除數部分強制COALESCE使用它的第二個參數,因此避免了被零除:

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

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 <> 0爲假則返回0