日期:2014-05-17  浏览次数:20446 次

数据舍取
带小数的数值放入nvarchar(50)字段中,想对小数点后的数值进行舍取,规则如下:
大于等于0且小于等于0.41取0
大于0.41且小于等于0.91取0.5
大于0.91且小于等于1取1

现在有个繁琐的方法如下:
DECLARE @AA VARCHAR(20),@BB FLOAT
SELECT @AA = '3.42'
SELECT @BB = CONVERT(FLOAT,@AA)
SELECT 
CASE WHEN CAST(@BB AS NUMERIC(10,2))-CAST(@BB AS INT) < 0.41 THEN CAST(@BB AS INT)
 WHEN CAST(@BB AS NUMERIC(10,2))-CAST(@BB AS INT) > =0.41 AND CAST(@BB AS NUMERIC(10,2))-CAST(@BB AS INT)<0.91 THEN CAST(@BB AS INT)+0.5
 WHEN CAST(@BB AS NUMERIC(10,2))-CAST(@BB AS INT) >= 0.91 THEN CAST(@BB AS INT)+1
END AS HH


请教更好的舍取方法
------解决方案--------------------

--这样算简化吗?
DECLARE @AA VARCHAR(20),@BB FLOAT,@CC  NUMERIC(10, 2)
SELECT  @AA = '3.42',@BB = CAST(@AA AS FLOAT),@CC=CAST(@AA AS NUMERIC(10, 2)) - CAST(@BB AS INT)

SELECT 
CASE 
WHEN @CC< 0.41 THEN 0
WHEN @CC>= 0.91 THEN 1
ELSE 0.5
END +CAST(@BB AS INT) AS HH

------解决方案--------------------
再改一下:

DECLARE @AA VARCHAR(20),@BB FLOAT
SELECT @AA = '3.42'
SELECT @BB = CONVERT(FLOAT,@AA)


SELECT 
CASE WHEN parsename(CAST(@BB AS varchar),1) < 41 THEN CAST(@BB AS INT)
 WHEN parsename(CAST(@BB AS varchar),1) > =41 AND parsename(CAST(@BB AS varchar),1)<91 THEN CAST(@BB AS INT)+0.5
 WHEN parsename(CAST(@BB AS varchar),1) >= 91 THEN CAST(@BB AS INT)+1
END AS HH
/*
HH
3.5
*/

------解决方案--------------------
SELECT 	CASE WHEN PARSENAME(@AA,1)<=41 THEN 0
     WHEN PARSENAME(@AA,1)>91 THEN 1
     ELSE 0.5
END
 
------解决方案--------------------
SELECT CAST(@AA*1.0 AS INT)+
         CASE WHEN PARSENAME(@AA,1)<=41 THEN 0
         WHEN PARSENAME(@AA,1)>91 THEN 1
         ELSE 0.5
         END