我知道SQL Server中的ABS和Round函数,但我相信我的问题有点不同,我不知道如何使用它们来实现所需的结果。
说我有一个号码:8000
我有一个返回此数字列表的查询:0,5000,10000,15000
如果我将ABS功能与此列表一起使用,例如
DECLARE @target as INT
SET @target = 8000
SELECT TOP(1) @result AS Number
FROM dbo.Numbers
ORDER BY ABS(Number - @target)
我得到10000
预期
但是我怎么能让这个返回5000,即我总是将结果四舍五入?
答案 0 :(得分:1)
了解您的问题意味着您想要最近的匹配而不会过去:
添加WHERE Number <= @target
。
答案 1 :(得分:1)
试试这个:
...
WHERE Number <= @target
ORDER BY Number DESC
我们只是得到第一个数字(ORDER BY Number DESC
)不大于@target(WHERE Number <= @target
)。
在ABS
中丢失ORDER BY
的好处是,DBMS现在应该可以使用Number
上的索引(如果有的话)。