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

SQL中如何截断/舍入varchar列计算的Occupancy值以显示为百分比

解决方案

首先注意到你写的计算逻辑和需求不符:你需要的是 Occupancy = OccupiedBeds/Total,但当前代码是 Total / (OccupiedBeds/1000),这会导致结果完全颠倒,先修正这个核心问题,再处理百分比格式化。

另外要注意处理Total=0的情况,避免出现除零错误。以下是几种实现需求的方法:

方法1:四舍五入到指定小数位(数值型结果)

使用ROUND函数将计算结果四舍五入到2位小数(适合图表用数值展示百分比),同时处理空值和除零:

CASE 
    WHEN ISNULL(CAST([Total] AS INT), 0) = 0 OR ISNULL(CAST([OccupiedBeds] AS INT), 0) = 0
        THEN 0
    ELSE ROUND(
        (CAST([OccupiedBeds] AS FLOAT) / CAST([Total] AS FLOAT)) * 100,
        2
    )
END AS Occupancy

如果需要整数百分比,把ROUND的第二个参数改成0即可。

方法2:截断到指定小数位(数值型结果)

如果不需要四舍五入,只想截断到2位小数,可以用FLOOR结合乘法实现:

CASE 
    WHEN ISNULL(CAST([Total] AS INT), 0) = 0 OR ISNULL(CAST([OccupiedBeds] AS INT), 0) = 0
        THEN 0
    ELSE CAST(
        FLOOR((CAST([OccupiedBeds] AS FLOAT) / CAST([Total] AS FLOAT)) * 100 * 100) / 100
        AS DECIMAL(10,2)
    )
END AS Occupancy

方法3:直接输出带%符号的格式化字符串

如果需要直接显示为类似10.87%的格式(适合直接展示),可以用FORMAT函数(SQL Server 2012及以上版本支持):

CASE 
    WHEN ISNULL(CAST([Total] AS INT), 0) = 0 OR ISNULL(CAST([OccupiedBeds] AS INT), 0) = 0
        THEN '0%'
    ELSE FORMAT(
        CAST([OccupiedBeds] AS FLOAT) / CAST([Total] AS FLOAT),
        'P2'
    )
END AS Occupancy

P2表示保留2位小数的百分比格式,改成P0就是整数百分比。

补充说明

  • 你之前替换FLOAT为DECIMAL(19,2)没生效,是因为计算顺序问题:先做除法得到FLOAT结果后再转DECIMAL,不会自动截断,需要用ROUND/CAST/FORMAT来显式处理。
  • 必须同时判断Total和OccupiedBeds是否为0,否则当Total=0时会触发除零错误。

内容的提问来源于stack exchange,提问作者Aruna Raghunam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:07:16