我有一个数字列,每个数字至少有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。
由于
答案 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)
答案 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