Округление * UP * до ближайшего 100 в SQL Server - PullRequest
35 голосов
/ 08 июля 2010

Можно ли легко округлить цифру до до ближайших 100 (или 1000, 500, 200 и т. Д.) В SQL Server?

Итак:

720 -> 800790 -> 8001401 -> 1500

Ответы [ 11 ]

48 голосов
/ 08 июля 2010

Следующее должно работать. Прочитав ваш вопрос, я не совсем уверен, что вы хотите, чтобы 100 вернулся. За это 100 возвращается 100.

select floor((X + 99) / 100) * 100;

Это дает следующие результаты:

0 -> 0
1 -> 100
99 -> 100
100 -> 100
101 -> 200
25 голосов
/ 14 августа 2013

Для округления до ближайшей тысячи, пожалуйста, попробуйте следующее: -

select round(YourValue, -3)

Ура !!!!! * * 1004

14 голосов
/ 08 июля 2010

Один из вариантов - использовать функцию CEILING () , например:

SELECT CEILING(@value/100.0) * 100

Может потребоваться сначала преобразовать значение в десятичное число в зависимости от его типа.

8 голосов
/ 08 сентября 2011

Используйте функцию ПОТОЛОК, чтобы округлить фигуру

DECLARE @Number DECIMAL, @RoundUp DECIMAL
SET @RoundUp = 100
SET @Number = 720
SELECT CEILING(@Number/@RoundUp)*@RoundUp
1 голос
/ 14 августа 2015

Попробуйте:

выберите раунд (@value, -2);

0 голосов
/ 05 мая 2018

Это будет работать и для значений с десятичной дробью.

select floor((ceiling (@value) + 99) / 100) * 100;

0 голосов
/ 28 апреля 2017

В дополнение к ответу Грея я бы использовал следующую встроенную функцию:

CREATE FUNCTION dbo.udf_RoundNearest
(
@Number bigint,
@RoundNearest bigint,
@Direction int
)

RETURNS TABLE AS 
RETURN

SELECT CASE WHEN @RoundNearest>=@Number THEN @Number
       ELSE
        (
                (@Number + CASE 
                           WHEN @Direction = 0 --Round Down
                           THEN 0
                           ELSE CASE WHEN @Number % @RoundNearest = 0 THEN 0 ELSE @RoundNearest END
                           END) / @RoundNearest) * @RoundNearest

   END Number

Определение параметра:

  1. @ Number - числовам нужно округлить
  2. @ RoundNearest 10-го, 100-го, 1000-го и т. д.
  3. @ Направление 0-> округлить вниз , 1->округление

с использованием функции:

SELECT * FROM dbo.udf_RoundNearest (1965,100,1) --> 2000
SELECT * FROM dbo.udf_RoundNearest (1359,100,0) --> 1300
SELECT * FROM dbo.udf_RoundNearest (1999,10,0) --1990
SELECT * FROM dbo.udf_RoundNearest (80,100,0) --> 80 (if the @number parameter is less or equal the @RoundNearest parameter the result will be the @number itself

также может использоваться применительно к таблице, например:

;with tmp (Value) as
  (select 1236 union all select 6584 union all select 9999)

    select t.*, fn.Number
    from tmp t
    cross apply dbo.udf_RoundNearest (Value,100,0) fn

    /*Result Set
    Value   Number
    1236    1200
    6584    6500
    9999    9900*/
0 голосов
/ 28 декабря 2016

Очень просто округлить число до любого кратного 10, используя просто функцию ROUND, например:

SELECT ROUND(number/1000,2)*1000 

Это даст вам ближайшую тысячную величину.

0 голосов
/ 21 мая 2015

Общее решение - используйте MOD, чтобы найти последнее 100-е место, а затем добавьте 100 к результату.

select (720 - MOD(720,100)) + 100 from dual;

Если вам нужно следующее 80-е место, просто замените любое «100» на «80».

0 голосов
/ 08 июля 2010

Вы можете использовать этот код, предполагая, что ваш amount является целым числом.Если нет, вам нужно будет разыграть, поэтому вы получите целочисленное деление.

If amount % 100 != 0 Then
   roundedAmount = ((amount / 100) * 100) + 100
Else
   roundedAmount = amount

Возможно, вы захотите упаковать это в пользовательскую функцию .

...