簡體   English   中英

除以零錯誤的SQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM