我遇到了被零除的問題。如果分母爲零,我希望該值爲零。當我嘗試使用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
我遇到了被零除的問題。如果分母爲零,我希望該值爲零。當我嘗試使用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
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
,這將導致result
是NULL
。整個結果然後有ISNULL()
將任何NULL變成0。
個人我會不是包括ISNULL()
並將結果保留爲NULL
。但是這取決於用例。
編輯:刪除CASE WHEN版本作爲我的另一個答案。
你需要一個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
相關閱讀:[聚合不要遵循CASE的語義](https://connect.microsoft.com/SQLServer/feedback/details/691535/aggregates-dont-follow-the-semantics-of-case) – HABO
是一個很好的閱讀。它似乎專門適用於聚合,而不適用於它們的組合。如果上面的語法失敗了,那會很難過,因爲那樣會留下很少其他選擇。 –
試試這個。
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
男人,我總是有問題!除以零,誰告訴我你不能這樣做.....我認爲這是我的一年級老師! :D你應該使用一個case語句來檢查sum(value)= 0,如果是這樣,不要劃分! – Limey