首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时使用大小写添加计算列时的意外结果

时使用大小写添加计算列时的意外结果
EN

Stack Overflow用户
提问于 2020-04-13 22:16:41
回答 1查看 44关注 0票数 0

我在Server中有一个表,如下所示。我正在从valueprevvalue列中计算百分比变化

代码语言:javascript
复制
CREATE TABLE temp 
(
   [date] varchar(7),   
   [name] varchar(1),    
   [value] int,
   [prevvalue] int
)

INSERT INTO temp ([date], [name], [value], [prevvalue])
VALUES
   ('2018-10', 'A', 10, 23),
   ('2018-09', 'B', 45, 23),
   ('2018-10', 'C', 55, 11),
   ('2018-10', 'D', 0, 23),
   ('2018-09', 'D', 22,  0)

这是我的问题。我使用CASE WHEN处理除以零的问题。

代码语言:javascript
复制
SELECT
    [date],
    [name], 
    [value],
    [prevvalue],
    CASE
       WHEN [prevvalue] = 0 
          THEN ([value] - [prevvalue]) / ([prevvalue] + 1)
          ELSE ([value] - [prevvalue]) / [prevvalue]
    END AS pctChangFromLast 
FROM
    temp 

然而,我得到的结果是:

代码语言:javascript
复制
date    name    value   prevvalue   pctChangFromLast
-------------------------------------------------------
2018-10 A       10         23        0.00000000000000
2018-09 B       45         23        0.00000000000000
2018-10 C       55         11        4.00000000000000
2018-10 D       0          23        -1.00000000000000
2018-09 D       22         0         2200.00000000000000

第1、2、4行的pctChangFromLast不正确。我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-13 22:18:41

我建议nullif()避免除以零.那么你的问题就是整数除法。在Server中,3/2 = 1,而不是1.5。

我通过乘以1.0来解决这个问题:

代码语言:javascript
复制
([value] - [prevvalue]) * 1.0 / nullif([prevvalue], 0) AS pctChangFromLast 

这将返回NULL,而不是当前一个值为0时返回一些惊人的数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61197711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档