You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算数据库表两列数值百分比变化时结果始终为0的问题

问题:SQL计算百分比变化始终返回0

我尝试计算数据库表中两列数值的百分比变化,但执行SQL语句后,Change(%)列始终返回0。预期AppServer04的百分比变化为97.86,AppServer05为93.05。以下是我的SQL代码及执行结果:

原SQL代码

-- create
CREATE TABLE Host  
(
    HostName Varchar(100),
    tcCount int,
    PrCount int
);

-- insert
INSERT INTO Host (HostName, tcCount, prCount) 
VALUES ('AppServer04', 125, 5852);
INSERT INTO Host (HostName, tcCount, prCount) 
VALUES ('AppServer05', 300 , 4318);

-- fetch 
SELECT
    HostName, tcCount, PrCount,
    (prCount - tcCount) / prCount * 100 AS 'Change(%)' 
FROM 
    Host

执行结果

HostName                                          tcCount     PrCount     Change(%)  
---------------------------------------------- ----------- ----------- -----------
AppServer04                                         125        5852           0
AppServer05                                         300        4318           0

(2 rows affected)

问题原因

问题出在整数除法的截断特性:tcCount和PrCount都是int类型,当执行(prCount - tcCount) / prCount时,两个整数相除会直接截断小数部分,只保留整数结果。比如AppServer04的计算过程是:(5852-125) = 5727,5727 / 5852 ≈ 0.9786,但整数除法会将结果截断为0,再乘以100后仍然是0。

解决方案

需要将运算中的至少一个操作数转换为浮点类型,让除法运算保留小数部分。以下是两种可行的修改方式:

方式1:使用CAST转换类型

SELECT
    HostName, tcCount, PrCount,
    CAST((prCount - tcCount) AS FLOAT) / prCount * 100 AS 'Change(%)' 
FROM 
    Host

方式2:通过乘以1.0自动转换为浮点

SELECT
    HostName, tcCount, PrCount,
    (prCount - tcCount) * 1.0 / prCount * 100 AS 'Change(%)' 
FROM 
    Host

可选:保留两位小数

如果需要将结果格式化保留两位小数,可以使用ROUND函数:

SELECT
    HostName, tcCount, PrCount,
    ROUND((prCount - tcCount) * 1.0 / prCount * 100, 2) AS 'Change(%)' 
FROM 
    Host

执行修正后的SQL后,AppServer04的Change(%)会返回97.86,AppServer05返回93.05,符合预期。

内容的提问来源于stack exchange,提问作者Zulfiqar Dholkawala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:35:11