SQL Server中SUM两列相除需返回两位小数的技术问题
问题解决与答疑
一、修改脚本返回保留两位小数的结果
要让除法结果保留两位小数,你可以通过显式指定数据类型或调整运算逻辑实现,以下是几种常用方法:
- 显式转换结果类型
用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
- 转换除数触发精确除法
将除数的求和结果转为带小数的decimal类型,确保运算过程中不会因类型规则丢失小数位:
select ColA, ColB, ColC, ColD, sum(ColA)/CAST(sum(nullif(ColB,0)) AS DECIMAL(18,2)) [TEST SUM] from [DB1].[Schema1].[Table1] a
- 结合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
相关产品推荐
相关产品推荐

