将值舍入到最接近的50

时间:2016-09-20 14:38:08

标签: sql-server rounding

我正在尝试将值向下舍入到最接近的50。 1-50它应该向下舍入到00以下,当它的51-休息时它应该向下舍入到50

前:

  • 245(直到1-49)它应该向下舍入到200
  • 258(从50-99)然后它应该向下舍入到250

我试过这个,它很好但我需要除了案例陈述之外的其他东西

@ResultAmount = ROUND(@ResultAmount, -2, 1) + 
    CASE    WHEN RIGHT(CONVERT(INT, FLOOR(@ResultAmount)), 2) IN (00, 50)
            THEN RIGHT(CONVERT(INT, FLOOR(@ResultAmount)), 2)
            WHEN RIGHT(CONVERT(INT, FLOOR(@ResultAmount)), 2) BETWEEN 1 AND 49
            THEN 00
            WHEN RIGHT(CONVERT(INT, FLOOR(@ResultAmount)), 2) BETWEEN 51 AND 99
            THEN 50
            END

提前致谢!!!

4 个答案:

答案 0 :(得分:2)

这就是你所需要的一切

SELECT FLOOR(@ResultAmount / 50) * 50;

例如

declare @ResultAmount decimal(10,2) = 249;

SELECT FLOOR(@ResultAmount / 50) * 50;

SET @ResultAmount = 250;

SELECT FLOOR(@ResultAmount / 50) * 50;

SET @ResultAmount = 200;

SELECT FLOOR(@ResultAmount / 50) * 50;

SET @ResultAmount = 199;

SELECT FLOOR(@ResultAmount / 50) * 50;

答案 1 :(得分:1)

听起来数字0-50被四舍五入到“50”,但任何大于这个的数字都应该四舍五入到最接近的50。如下所示应该有效:

(CASE WHEN f1/50 < 1 THEN 1 ELSE ceiling(f1/50) END) * 50 AS rounded_to_50

答案 2 :(得分:0)

您可以简单地将数字除以50,然后再乘以50,例如:

select cast(round(@i/50.0,0)*50 as int)

如果@i为524,则返回500,如果@i为525,则返回550.

您可以创建一个功能,使这更容易:

create function fn_Round_By(@input int,@divider float) 
returns int
as
begin 
    RETURN (cast(round(@input/@divider,0)*@divider as int));
end

再次,select dbo.fn_Round_By(525,50)返回550 and选择dbo.fn_Round_By(524,50)`返回500。

如果您希望小于50的值将向上舍入为50,则可以使用简单的CASE,例如:

create function fn_Round_By(@input int,@divider float) 
returns int
as
begin 
    RETURN (
        CASE 
            WHEN @input <=@divider then @divider
            else cast(round(@input/@divider,0)*@divider as int)
        END
        );
end

舍入由FLOOR函数执行,因此向下舍入到特定间隔的函数将是:

create function fn_Floor_By(@input int,@divider float) 
returns int
as
begin 
    RETURN (cast(FLOOR(@input/@divider)*@divider as int));
end

或者,保留将50以下任何东西四舍五入的逻辑:

create function fn_Floor_By(@input int,@divider float) 
returns int
as
begin 
    RETURN (
        CASE 
            WHEN @input <=@divider then @divider
            else cast(FLOOR(@input/@divider)*@divider as int)
        END
        );
end

答案 3 :(得分:0)

您可以计算模50并使用它来减少原始值

DRY