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

SQL Server中SUM两列相除需返回两位小数的技术问题

问题解决与答疑

一、修改脚本返回保留两位小数的结果

要让除法结果保留两位小数,你可以通过显式指定数据类型或调整运算逻辑实现,以下是几种常用方法:

  1. 显式转换结果类型
    用CAST或CONVERT将除法结果转为带两位小数的decimal类型,确保数据类型和显示格式一致:
select ColA, ColB, ColC, ColD, 
       CAST(sum(ColA)/sum(nullif(ColB,0)) AS DECIMAL(18,2)) [TEST SUM]
from [DB1].[Schema1].[Table1] a
-- 注意:如果需要按ColA/ColB/ColC/ColD分组,必须添加GROUP BY ColA, ColB, ColC, ColD
  1. 转换除数触发精确除法
    将除数的求和结果转为带小数的decimal类型,确保运算过程中不会因类型规则丢失小数位:
select ColA, ColB, ColC, ColD, 
       sum(ColA)/CAST(sum(nullif(ColB,0)) AS DECIMAL(18,2)) [TEST SUM]
from [DB1].[Schema1].[Table1] a
  1. 结合ROUND函数控制小数位
    如果需要四舍五入到两位小数,可使用ROUND函数,配合转换确保数据类型符合要求:
select ColA, ColB, ColC, ColD, 
       CAST(ROUND(sum(ColA)/sum(nullif(ColB,0)), 2) AS DECIMAL(18,2)) [TEST SUM]
from [DB1].[Schema1].[Table1] a

二、关于decimal运算默认是否四舍五入的答疑

你的理解不完全正确。SQL Server中,decimal类型的运算结果精度和小数位数由系统内置规则决定,并非默认保留所有小数位:

  • 当两个decimal类型值进行除法运算时,结果的精度和小数位数会按照固定公式计算(例如:精度为p1 - s1 + s2 + max(6, s1 + p2 + 1),小数位数为max(6, s1 + p2 + 1),其中p1/s1是被除数的精度/小数位,p2/s2是除数的精度/小数位)。
  • 如果运算结果的实际小数位数超过规则计算出的小数位数,系统会自动截断或四舍五入到指定长度,哪怕源列和目标类型都是decimal,也可能出现结果被截断为整数的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:03:23