我正在尝试将值向下舍入到最接近的50。 1-50它应该向下舍入到00以下,当它的51-休息时它应该向下舍入到50
前:
我试过这个,它很好但我需要除了案例陈述之外的其他东西
@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 :(得分: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