T-SQL向下舍入到2位小数

时间:2018-01-19 22:22:33

标签: sql sql-server tsql

我有一个数字列,每个数字至少有5个小数。示例如下。

如何将列舍入为2位小数,同时在SQL Server中保持前3个数字的总和以及最后两个数字的总和等于100.00?

Numbers
22.41489
57.34326
20.24185
73.50463
26.49537

我测试了一些sql。例如,

select cast(round('22.41489',2) as decimal(18,2)) as a, cast(round('57.34326',2) as decimal(18,2)) as b
,cast(round('20.24185',2) as decimal(18,2)) as c, cast(round('73.50463',2) as decimal(18,2))  as d 
, cast(round('26.49537',2) as decimal(18,2)) as e

a,b,c的总和为99.99。由于所有数字都在同一列中,我需要对所有数字应用相同的转换。我不能将变换1用于前3个数字,并对最后2个数字应用变换2。

由于

3 个答案:

答案 0 :(得分:4)

您可以使用“窗口函数”将缺失部分添加到舍入期间丢失最多的数字。像这样:

declare @T table (grp int, num numeric(10,5))
insert into @T (grp, num) values
(1, 22.41489),
(1, 57.34326),
(1, 20.24185),
(2, 73.50463),
(2, 26.49537)

select
    grp,
    num as original_number,
    round(num, 2) + 
    case when 1 = row_number() over (partition by grp order by num - round(num, 2) desc)
    then (100 - sum(round(num, 2)) over (partition by grp))
    else 0
    end as modified_number  
from @T

<强>结果

1   22.41489    22.42000
1   57.34326    57.34000
1   20.24185    20.24000
2   73.50463    73.50000
2   26.49537    26.50000

答案 1 :(得分:0)

你可以使用round()功能,即使在总和

之后

查看此Fiddle

答案 2 :(得分:0)

如果我正确理解您的问题,您希望将数字舍入到小数点后2位,但您仍希望总和相同。这不会永远成立。例如,如果我添加这5个数字:

 (1.2, 1.2, 1.2, 1.2, 1.2)

我会得到6,但是如果我先将所有数字四舍五入,那就拿下总和:

 (1.0, 1.0, 1.0, 1.0, 1.0)

我会得到5.这不是SQL Server的限制,这只是数学。

对于您的商业案例,我会看看您是否可以&#34; round&#34;和&#34;总和&#34;您正在使用的任何前端的数字(例如Reporting Services,Excel等),如果您汇总了值,它可以自由截断小数位,同时保持幕后精度。

如果这不是一个选项,则返回舍入/格式化值和全精度值。使用舍入/格式化值进行UI /显示,并使用完整精度值进行进一步聚合。

CREATE TABLE NumberTable
(
    Number numeric(10,5)
);

INSERT INTO NumberTable
VALUES
 (22.41489),
 (57.34326),
 (20.24185),
 (73.50463),
 (26.49537);

SELECT Number,
    Cast(Round(Number*100,0)/100.00 as numeric(5,2)) RoundedNumber,
    Format(Number,'0.00') FormattedNumber
FROM NumberTable