Sql server SQL中的自定义舍入

Sql server SQL中的自定义舍入,sql-server,tsql,Sql Server,Tsql,如何在SQL中设置自定义舍入规则 我需要制定以下规则: if second number after decimal is 1-2 eg. 10,02 - round it to 0 result 10,00 if second number after decimal is 3-7 eg. 10,13 - round it to 5 result 10,15 if second number after decimal is 8-9 eg. 10,28 - round i

如何在SQL中设置自定义舍入规则

我需要制定以下规则:

if second number after decimal is 1-2   eg.  10,02 - round it to 0  result 10,00
if second number after decimal is 3-7   eg.  10,13 - round it to 5  result 10,15
if second number after decimal is 8-9   eg.  10,28 - round it to bigger number  result 10,3
有人能帮我怎么做吗?舍入函数在0-5和5以上工作,但如何基于此规则执行“自定义舍入函数”


提前感谢。

一种可能的方法是以下声明:

SELECT
   [Number],
   CASE 
      WHEN ([Number] * 100) % 10 BETWEEN 3 AND 7 THEN ROUND([Number] + 0.02, 1) - 0.05
      ELSE ROUND([Number] + 0.02, 1)
   END [RoundedNumber]  
FROM (VALUES (10.00), (10.01), (10.12), (10.13), (10.14), (10.28), (10.29)) v ([Number])
结果:

Number  RoundedNumber
10.00   10.00
10.01   10.00
10.12   10.10
10.13   10.15
10.14   10.15
10.28   10.30
10.29   10.30

一种可能的方法是以下陈述:

SELECT
   [Number],
   CASE 
      WHEN ([Number] * 100) % 10 BETWEEN 3 AND 7 THEN ROUND([Number] + 0.02, 1) - 0.05
      ELSE ROUND([Number] + 0.02, 1)
   END [RoundedNumber]  
FROM (VALUES (10.00), (10.01), (10.12), (10.13), (10.14), (10.28), (10.29)) v ([Number])
结果:

Number  RoundedNumber
10.00   10.00
10.01   10.00
10.12   10.10
10.13   10.15
10.14   10.15
10.28   10.30
10.29   10.30

您可以定义您的自定义功能并永远使用它

DECLARE @NUM REAL =10.01;
DECLARE @RESULT NVARCHAR(MAX)

IF @NUM=ROUND(@NUM,0)
BEGIN
    SET @RESULT=@NUM
END
ELSE
BEGIN
    DECLARE @NUM_STR VARCHAR(MAX)=CAST(@NUM AS VARCHAR(MAX)) -- CONVERT TO VARCHAR
    DECLARE @LEFT VARCHAR(MAX)= CASE WHEN @NUM>=0 THEN FLOOR(@NUM) ELSE CEILING(@NUM) END -- GET LEFT SIDE NUMBERS
    DECLARE @RIGHT VARCHAR(MAX)= REPLACE(@NUM_STR,CONCAT(@LEFT,'.'),'') -- GET RIGHT SIDE NUMBERS
    ... -- YOUR ROLES
END

您可以定义您的自定义功能并永远使用它

DECLARE @NUM REAL =10.01;
DECLARE @RESULT NVARCHAR(MAX)

IF @NUM=ROUND(@NUM,0)
BEGIN
    SET @RESULT=@NUM
END
ELSE
BEGIN
    DECLARE @NUM_STR VARCHAR(MAX)=CAST(@NUM AS VARCHAR(MAX)) -- CONVERT TO VARCHAR
    DECLARE @LEFT VARCHAR(MAX)= CASE WHEN @NUM>=0 THEN FLOOR(@NUM) ELSE CEILING(@NUM) END -- GET LEFT SIDE NUMBERS
    DECLARE @RIGHT VARCHAR(MAX)= REPLACE(@NUM_STR,CONCAT(@LEFT,'.'),'') -- GET RIGHT SIDE NUMBERS
    ... -- YOUR ROLES
END

您可以创建自己的函数以使用自定义舍入规则:

CREATE FUNCTION CustomRound(@num DECIMAL(18,2))
RETURNS DECIMAL(18,2)
AS
BEGIN
  RETURN ROUND(@num, 1, 1) + 
    CASE WHEN (@num - ROUND(@num, 1, 1)) * 100 BETWEEN 1 AND 2 THEN 0
         WHEN (@num - ROUND(@num, 1, 1)) * 100 BETWEEN 3 AND 7 THEN 0.05
         WHEN (@num - ROUND(@num, 1, 1)) * 100 BETWEEN 8 AND 9 THEN 0.1
    END
END
此函数用于截断第一位小数后的十进制数,并根据需要根据第二位小数添加一个“舍入”值

您可以像这样使用上述功能:

SELECT dbo.CustomRound(10.12) -- 10.10
SELECT dbo.CustomRound(10.02) -- 10.00
SELECT dbo.CustomRound(10.13) -- 10.15
SELECT dbo.CustomRound(10.28) -- 10.30
SELECT dbo.CustomRound(10.12, 2) -- 10.10
SELECT dbo.CustomRound(10.02, 2) -- 10.00
SELECT dbo.CustomRound(10.13, 2) -- 10.15
SELECT dbo.CustomRound(10.28, 2) -- 10.30

-- or    
SELECT dbo.CustomRound(10.102, 3) -- 10.100
SELECT dbo.CustomRound(10.002, 3) -- 10.000
SELECT dbo.CustomRound(10.103, 3) -- 10.105
SELECT dbo.CustomRound(10.208, 3) -- 10.210


您还可以使用自定义舍入功能将此功能扩展为更具动态性:

CREATE FUNCTION CustomRound(@num DECIMAL(18,6), @precision INT)
RETURNS DECIMAL(18,6)
AS
BEGIN
  DECLARE @prec INT = IIF(@precision > 0, @precision - 1, 0);
  
  RETURN ROUND(@num, @prec, 1) + 
    CASE WHEN (@num - ROUND(@num, @prec, 1)) * POWER(10, @precision) BETWEEN 1 AND 2 THEN 0.0 / POWER(10, @precision)
         WHEN (@num - ROUND(@num, @prec, 1)) * POWER(10, @precision) BETWEEN 3 AND 7 THEN 5.0 / POWER(10, @precision)
         WHEN (@num - ROUND(@num, @prec, 1)) * POWER(10, @precision) BETWEEN 8 AND 9 THEN 10.0 / POWER(10, @precision)
    END
END
您可以这样使用此功能:

SELECT dbo.CustomRound(10.12) -- 10.10
SELECT dbo.CustomRound(10.02) -- 10.00
SELECT dbo.CustomRound(10.13) -- 10.15
SELECT dbo.CustomRound(10.28) -- 10.30
SELECT dbo.CustomRound(10.12, 2) -- 10.10
SELECT dbo.CustomRound(10.02, 2) -- 10.00
SELECT dbo.CustomRound(10.13, 2) -- 10.15
SELECT dbo.CustomRound(10.28, 2) -- 10.30

-- or    
SELECT dbo.CustomRound(10.102, 3) -- 10.100
SELECT dbo.CustomRound(10.002, 3) -- 10.000
SELECT dbo.CustomRound(10.103, 3) -- 10.105
SELECT dbo.CustomRound(10.208, 3) -- 10.210

您可以创建自己的函数来使用自定义舍入规则:

CREATE FUNCTION CustomRound(@num DECIMAL(18,2))
RETURNS DECIMAL(18,2)
AS
BEGIN
  RETURN ROUND(@num, 1, 1) + 
    CASE WHEN (@num - ROUND(@num, 1, 1)) * 100 BETWEEN 1 AND 2 THEN 0
         WHEN (@num - ROUND(@num, 1, 1)) * 100 BETWEEN 3 AND 7 THEN 0.05
         WHEN (@num - ROUND(@num, 1, 1)) * 100 BETWEEN 8 AND 9 THEN 0.1
    END
END
此函数用于截断第一位小数后的十进制数,并根据需要根据第二位小数添加一个“舍入”值

您可以像这样使用上述功能:

SELECT dbo.CustomRound(10.12) -- 10.10
SELECT dbo.CustomRound(10.02) -- 10.00
SELECT dbo.CustomRound(10.13) -- 10.15
SELECT dbo.CustomRound(10.28) -- 10.30
SELECT dbo.CustomRound(10.12, 2) -- 10.10
SELECT dbo.CustomRound(10.02, 2) -- 10.00
SELECT dbo.CustomRound(10.13, 2) -- 10.15
SELECT dbo.CustomRound(10.28, 2) -- 10.30

-- or    
SELECT dbo.CustomRound(10.102, 3) -- 10.100
SELECT dbo.CustomRound(10.002, 3) -- 10.000
SELECT dbo.CustomRound(10.103, 3) -- 10.105
SELECT dbo.CustomRound(10.208, 3) -- 10.210


您还可以使用自定义舍入功能将此功能扩展为更具动态性:

CREATE FUNCTION CustomRound(@num DECIMAL(18,6), @precision INT)
RETURNS DECIMAL(18,6)
AS
BEGIN
  DECLARE @prec INT = IIF(@precision > 0, @precision - 1, 0);
  
  RETURN ROUND(@num, @prec, 1) + 
    CASE WHEN (@num - ROUND(@num, @prec, 1)) * POWER(10, @precision) BETWEEN 1 AND 2 THEN 0.0 / POWER(10, @precision)
         WHEN (@num - ROUND(@num, @prec, 1)) * POWER(10, @precision) BETWEEN 3 AND 7 THEN 5.0 / POWER(10, @precision)
         WHEN (@num - ROUND(@num, @prec, 1)) * POWER(10, @precision) BETWEEN 8 AND 9 THEN 10.0 / POWER(10, @precision)
    END
END
您可以这样使用此功能:

SELECT dbo.CustomRound(10.12) -- 10.10
SELECT dbo.CustomRound(10.02) -- 10.00
SELECT dbo.CustomRound(10.13) -- 10.15
SELECT dbo.CustomRound(10.28) -- 10.30
SELECT dbo.CustomRound(10.12, 2) -- 10.10
SELECT dbo.CustomRound(10.02, 2) -- 10.00
SELECT dbo.CustomRound(10.13, 2) -- 10.15
SELECT dbo.CustomRound(10.28, 2) -- 10.30

-- or    
SELECT dbo.CustomRound(10.102, 3) -- 10.100
SELECT dbo.CustomRound(10.002, 3) -- 10.000
SELECT dbo.CustomRound(10.103, 3) -- 10.105
SELECT dbo.CustomRound(10.208, 3) -- 10.210

你可以乘以20,然后四舍五入到整数,再除以20

e、 g


你可以乘20,然后四舍五入到整数,再除以20

e、 g


10.12
四舍五入-
10.1
的结果是什么?
10.12
四舍五入-
10.1
的结果是什么?