[英]Divide by zero error sql
我使用以下方法得到除以零的錯誤:
Select Top 100 *, Case (a.value)
When 0.0
Then Null
Else ((cast(b.value as decimal) - cast(a.value as decimal))/cast(a.value as decimal)) * 100
End
as 'Montly Price Change (%)'
From AllProducts a
Join AllProducts b
On a.series_id=b.series_id And (b.Date = DATEADD(month, 1, a.Date))
我找不到解決此問題的方法。
Select Top 100 *, Case cast((a.value) as decimal)
When 0.0
Then Null
Else ((cast(b.value as decimal) - cast(a.value as decimal))/cast(a.value as decimal)) * 100
End
as 'Montly Price Change (%)'
From AllProducts a
Join AllProducts b
On a.series_id=b.series_id And (b.Date = DATEADD(month, 1, a.Date))
但這出於某種原因使我的整個列為空。
除以NULL的任何數字都會得到NULL,並且不會產生錯誤。
Select Top 100 *, Case cast((a.value) as decimal)
When 0.0
Then Null
Else ((cast(b.value as decimal) - cast(a.value as decimal))/NULLIF(cast(a.value as decimal)),0) * 100
End
as 'Montly Price Change (%)'
From AllProducts a
Join AllProducts b
On a.series_id=b.series_id And (b.Date = DATEADD(month, 1, a.Date))
如果您想返回零
COALESCE(cast(a.value as decimal))/NULLIF(cast(a.value as decimal)),0),0)
使用NULLIF將起作用
Select Top 100 *,
((cast(b.value as decimal) - cast(a.value as decimal))/NULLIF(cast(a.value as decimal),0)) * 100
as 'Montly Price Change (%)'
From AllProducts a
Join AllProducts b
On a.series_id=b.series_id And (b.Date = DATEADD(month, 1, a.Date))
我認為“小數”類型的默認小數位數(小數點后的位數)為0。因此,表達式中小於<1的分母總是求值為0。嘗試使用小數(10 ,3)。
我猜您的值都小於1? 十進制小數位數的默認值為0。因此,如果您的值小於1,則它們都將轉換為0。您可以使用cast(a.value as decimal(<precision>,<scale>))
,也可以強制浮動。
這樣的事情應該起作用:
Select Top 100 *,
(cast(b.value as float) - cast(a.value as float))/cast(nullif(a.value,0) as float)) * 100 as 'Montly Price Change (%)'
From AllProducts a
Join AllProducts b
On a.series_id=b.series_id And (b.Date = DATEADD(month, 1, a.Date))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.