0

我知道 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 即我总是得到四舍五入的结果?

4

2 回答 2

1

理解你的问题意味着你想要最接近的匹配而不需要过去:

添加一个WHERE Number <= @target.

于 2012-09-27T00:54:11.393 回答
1

试试这个:

...
WHERE Number <= @target
ORDER BY Number DESC

我们只需得到ORDER BY Number DESC不大于@target ( ) 的第一个数字 ( WHERE Number <= @target)。

ABS在这方面失去ORDER BY的好处是 DBMS 现在应该能够使用索引Number(如果有的话)。

于 2012-09-27T00:58:58.003 回答