sql server 保留小数
最近在报表显示中遇到一个小问题,要求如下:
A字段除以B字段,如果不能整除需要保留4位小数,否则不需要保留小数。举例如下:
情况1:A = 12 , B = 5 结果 = 12 / 5 = 2.4000
情况2: A = 12, B = 3 结果 = 12 / 3 = 4
更具要求我初步的想法是:通过取模来判断是否保留小数。 T-SQL如下:
1 DECLARE @a INT 2 DECLARE @b INT 3 DECLARE @c INT 4 DECLARE @d INT 5 SET @a = 12 6 SET @b = 5 7 SET @c = 12 8 SET @d = 3 9 10 SELECT CASE WHEN @a % @b = 0 THEN @a / @b 11 ELSE CAST(@a * 1.0 / @b AS DECIMAL(10,4)) END '12 / 5', 12 CASE WHEN @c % @d = 0 THEN @c / @d 13 ELSE CAST(@c * 1.0 / @d AS DECIMAL(10,4)) END '12 / 3' 14
如下是运行结果(Sql Server 2005),令我有些奇怪,整除的情况也被保留了4位小数,难道被系统隐示转换了?
于是我使用cast()函数将整除情况强制转换为整数,修改后的T-SQL:
1 SELECT CASE WHEN @a % @b = 0 THEN CAST(@a / @b AS INT) 2 ELSE CAST(@a * 1.0 / @b AS DECIMAL(10,4)) END '12 / 5', 3 CASE WHEN @c % @d = 0 THEN CAST(@c / @d AS INT) 4 ELSE CAST(@c * 1.0 / @d AS DECIMAL(10,4)) END '12 / 3'
令我疑惑的是,结果依然一样,运行结果如下:
后来咨询了一些朋友,给的解决方法是将其转换为字符。T-SQL如下:
1 SELECT CASE WHEN @a % @b = 0 THEN CAST(@a / @b AS VARCHAR(16)) 2 ELSE CAST(CAST(@a * 1.0 / @b AS DECIMAL(10,4)) AS VARCHAR(32)) END '12 / 5', 3 CASE WHEN @c % @d = 0 THEN CAST(@c / @d AS VARCHAR(16)) 4 ELSE CAST(CAST(@c * 1.0 / @d AS DECIMAL(10,4)) AS VARCHAR(32)) END '12 / 3'
期待的运行结果如下:
这个问题虽然解决了,但是又产生了新的问题,也就是为什么使用cast(express as int)后结果仍是是保留4位小数?