2017-10-10 91 views
1

我得到一個除0錯誤與此代碼:紅移被零除益智遊戲

CASE 
WHEN DENOMINATOR >= 0 
THEN SUM(INT1 * INT2/DENOMINATOR) 
ELSE 0 
END AS RATIO 

但是當我改成下面的代碼,它的工作。

CASE 
WHEN DENOMINATOR >= 0 
THEN SUM(INT1) * INT2/DENOMINATOR 
ELSE 0 
END AS RATIO 

有人能幫我理解原因,所以我可以在將來避免這種情況嗎?順便說一句,第一個樣品在Vertica中工作。我認識到總結需要總結的內容,而不是在求和之前進行計算,這是一個更好的編程實踐。但仍然很好奇。

+1

'CASE WHEN DENOMINATOR> = 0' .... ....似乎是錯的...如果你試圖避免0錯誤的分裂......你不是指'>'0不是'> ='或只要'<>'0,如果你想允許否定? – xQbert

+0

我猜是否定的分母應該是0.因此,其他的只是> not> = – xQbert

+0

負數問題與問題無關。關鍵是DEMONIMATOR不應該是零。我試圖理解爲什麼一個人工作,另一個人給我一個錯誤。 – cjremley

回答

3

我想,以避免除以零的最好方法是使用nullif()

SUM(INT1 * INT2/NULLIF(DENOMINATOR, 0)) 

或:

SUM(INT1) * INT2/NULLIF(DENOMINATOR, 0) 

這將返回NULL,我找了分頻更明智逐零的情況。如果你喜歡,你可以添加COALESCE()來得到0

+0

如何應對DENOMINATOR的負值? –

+0

@JonScott。 。 。你需要一個'CASE'來處理它們。 –