2012-06-28 68 views
3

我遇到了被零除的問題。如果分母爲零,我希望該值爲零。當我嘗試使用nullif時,最終計算出的值爲零或1。SQL除以零和函數

這裏是SQL:

Select 
    StateCode, Month1Date,(Sum(Order)/Sum(Value)) as myValue  
from tblOrders  
    inner join tblStates on OrderStateCode = StateCode  
group by StateCode, Month1Date 
+0

男人,我總是有問題!除以零,誰告訴我你不能這樣做.....我認爲這是我的一年級老師! :D你應該使用一個case語句來檢查sum(value)= 0,如果是這樣,不要劃分! – Limey

回答

3
Select 
    StateCode, 
    Month1Date, 
    ISNULL(Sum(Order)/NULLIF(Sum(Value), 0), 0) AS myValue 
from 
    tblOrders 
inner join 
    tblStates 
    on OrderStateCode = StateCode 
group by 
    StateCode, 
    Month1Date 

一個0分母改爲NULL,這將導致resultNULL。整個結果然後有ISNULL()將任何NULL變成0。

個人我會不是包括ISNULL()並將結果保留爲NULL。但是這取決於用例。

編輯:刪除CASE WHEN版本作爲我的另一個答案。

5

你需要一個case語句:

Select StateCode, Month1Date, 
     (case when sum(value) = 0 then 0 else Sum(Order)/Sum(Value) 
     end) as myValue 
from tblOrders inner join 
    tblStates 
    on OrderStateCode = StateCode 
group by StateCode, Month1Date 
+1

相關閱讀:[聚合不要遵循CASE的語義](https://connect.microsoft.com/SQLServer/feedback/details/691535/aggregates-dont-follow-the-semantics-of-case) – HABO

+0

是一個很好的閱讀。它似乎專門適用於聚合,而不適用於它們的組合。如果上面的語法失敗了,那會很難過,因爲那樣會留下很少其他選擇。 –

0

試試這個。

SELECT StateCode, Month1Date, 
     CASE WHEN SUM(Value) <> 0 THEN(SUM(Order)/SUM(Value)) 
     ELSE 0 END as myValue 
    FROM tblOrders 
    INNER JOIN tblStates ON OrderStateCode = StateCode 
    GROUP BY StateCode, Month1Date