Sql server 将该值四舍五入至最接近的50

Sql server 将该值四舍五入至最接近的50,sql-server,rounding,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)

我正试图把这个值四舍五入到最接近的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

提前感谢

听起来好像数字0-50被四舍五入到“50”,但是任何大于这个数字的数字都应该四舍五入到最接近的50。类似于以下的方法应该可以工作:

(CASE WHEN f1/50 < 1 THEN 1 ELSE ceiling(f1/50) END) * 50 AS rounded_to_50
(当f1/50<1时,则1个其他天花板(f1/50)结束)*50四舍五入到50

您只需将数字除以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
同样,
选择dbo.fn\u Round\u By(525,50)
返回
550和
选择dbo.fn\u Round\u By(524,50)`返回500

如果要将小于50的值四舍五入到50,可以使用简单的
案例
,例如:

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
或者,保留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
创建函数fn\u Floor\u By(@input int,@divider float)
返回整数
作为
开始
返回(
案例
当@input时,这就是您所需要的全部

SELECT FLOOR(@ResultAmount / 50) * 50;
e、 g以下

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;

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

DECLARE @ResultAmount int = 243

SELECT @ResultAmount - (@ResultAmount%50)

只需将数字除以50(num/50),如果结果“R”为奇数,余数(num%50)为gt 0,则(R+1)*50,否则R*50我读对了吗?1-50应该是50,245应该是200,然后258又是300?向上/向下的逻辑是什么?@Jamiec我想和
2.45
是2
的四舍五入,但是
2.55
四舍五入到
3
@Jamiec但是你是
245
中最接近的50是
250
,而不是
200
,所以基本上任何带有模式
*5x-*9x
的值都应该四舍五入到
*50
,任何带有
*0x-*4x
的值都应该四舍五入到
*00
1073到1050,1023到1000,等等。50的精确倍数是多少?比如50?保持在50还是降到0?为什么不检查
f1(案例f1感谢帮助进行了一个小的更正!!其lke应始终向下取整。..lke如果是230,则应向200取整,如果是260或280,则应向250取整!!向下取整由
FLOOR
函数执行,但您的示例相互矛盾,例如230应被截断为200,但258应变为300但260变为250?您想要的逻辑到底是什么?我想执行向下取整lke,如果它的230应该向下取整为200,如果它是258或280(51-99之间的任何值)它应该四舍五入到250!!!thanks@kris然后请修正问题文本,并明确表示您想要向下舍入。我已经在答案中添加了使用
FLOOR
的函数。这是您想要的吗?需要注意的一点是,这是向下舍入(这是OP要求的)。
DECLARE @ResultAmount int = 243

SELECT @ResultAmount - (@ResultAmount%50)