计算数据库表两列数值百分比变化时结果始终为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
相关产品推荐
相关产品推荐

