Округлить вверх или вниз до ближайшего 20 - PullRequest
5 голосов
/ 22 декабря 2011

Как показывает вопрос, мне нужно округлить в большую или меньшую сторону до ближайшего 20, за исключением чисел от 0 до 14, все должны округляться до 20, поскольку нулевые значения не допускаются. Таблица не должна обновлятьсяновые значения. На данный момент мне удалось только округлить вверх или вниз до ближайших 100, как показано ниже:

 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]

Ответы [ 3 ]

5 голосов
/ 22 декабря 2011

Попробуйте:

DECLARE @testValue Int = 35;

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

Возможно, существует более оптимальный подход, но это было первое решение, которое пришло на ум.* 1.0 - для принудительного преобразования в число с плавающей запятой, чтобы / 20 давал дробные результаты.Результат округляется с использованием ROUND, затем умножается обратно на 20, чтобы получить окончательное «округленное» значение.

Отредактировано с учетом вашего особого случая 0-14 ...

2 голосов
/ 22 декабря 2011

Это будет работать:

--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 голосов
/ 26 декабря 2011

Я предпочитаю целочисленное деление *, где это возможно, и если 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 использует целочисленное деление, когда оба операнда целочисленные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...