2011-12-22 50 views
5

正如問題所示,我需要舍入或舍入到最接近的20,除了0-14之間的數字外,所有舍入都必須舍入爲20,因爲不允許有零值。向上或向下舍入爲最接近的20

CASE WHEN ROUND(number,-2)=0 THEN CAST(ROUND(number,-2)+100 AS DECIMAL(18, 0)) 
     ELSE CAST(ROUND(number,-2) AS DECIMAL(18,0)) END AS [NUMBER] 

回答

5

試試這個:

DECLARE @testValue Int = 35; 

SELECT 
    CASE 
    WHEN @testValue BETWEEN 0 AND 14 THEN 20 
    ELSE ROUND((@testValue * 1.0)/20, 0) * 20 
    END MyRoundedValue; 

可能有多個表還沒有與新values.For更新我現在只處理或如下所示四捨五入到最接近100最佳方法,但這是第一個想到的解決方案。 * 1.0將強制轉換爲浮點數,以便/ 20將生成分數結果。結果使用ROUND進行四捨五入,然後再乘以20以得到最終的「舍入」值。

編輯把你的0-14考慮特殊情況...

+0

除以20.0將強制浮點數。你不需要以1.0倍數 – cadrell0 2011-12-22 14:19:02

+1

因此,它基本上是一樣的想法。但是,是的,它也可以寫成'ELSE ROUND(@testValue/20.0,0)* 20'。如果'20'是一個也是'Int'的變量,那麼您將需要'* 1.0'。 – Yuck 2011-12-22 14:19:57

+0

我不知道爲什麼有時結果是1或2(不同的值btw,19; 29; 16等)。但我修改了我的問題中描述的格式的代碼,它的工作非常好。感謝很多,我沒有想到與1.0相乘。 – Hari 2011-12-22 14:35:37

2

這將工作:

--N = Your nearest number 
--X = Number to round 
SELECT ROUND(X/N, 0) * N 

實例應用:

DECLARE @numberToRound INT; 
SET @numberToRound = 25; 

CASE WHEN @numberToRound BETWEEN 0 AND 14 THEN 
    20 
ELSE 
    ROUND((CAST(@numberToRound AS DECIMAL)/20.00), 0) * 20 
END 
0

我喜歡整數除法*如果可能,並且如果number是一個整數,我的解決方案很可能是這樣的:

CASE 
    WHEN number BETWEEN 0 AND 14 THEN 20 /* actually, it seems to make more sense 
              to have the range as BETWEEN 0 AND 9, 
              because values from 10 to 14 would be 
              converted to 20 with the ELSE branch 
              anyway */ 
    ELSE (number + 10)/20 * 20 
END 

* SQL Server使用整數除法時兩個操作數均爲整數。