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         
View Code

如下是运行结果(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'
View Code

令我疑惑的是,结果依然一样,运行结果如下:

 

后来咨询了一些朋友,给的解决方法是将其转换为字符。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'
View Code

期待的运行结果如下:

 

 这个问题虽然解决了,但是又产生了新的问题,也就是为什么使用cast(express as int)后结果仍是是保留4位小数?

posted @ 2014-07-01 17:28  freecodeX  阅读(1174)  评论(0编辑  收藏  举报