Sql server SQL中的自定义舍入
如何在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
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
的结果是什么?