sql - 将所有数字四舍五入,但保留总和
问题描述
假设我有 4 条记录如下:
CASH
========
1993.772
5015.572
996.884
1993.772
这些数字加起来10000.00
。现在我想将所有这些数字四舍五入到小数点后两位,但总和保持为10000.00
.
在上面的例子中,如果我删除最后一个数字,数字的总和将是9999.99
而不是10000.00
,但这样的东西仍然会加起来10000.00
:
CASH
========
1993.78 <- changed from 1993.77 to 1993.78
5015.57
996.88
1993.77
有什么简单的方法吗?
解决方案
这是具有挑战性的。这是一种方法:
select t.*,
round(cash, 2),
(case when row_number() over (order by cash desc) = 1
then sum(cash) over () - sum(round(cash, 2)) over (order by cash rows between unbounded preceding and 1 preceding)
else round(cash, 2)
end)
from t;
这是一个 db<>fiddle。
基本上,这会将所有值四舍五入到小数点后两位,除了最大的一位。对于那个,它从总数中减去舍入值的总和。
注意:这会将额外的值添加到最大值。它可以舍入最小值,但我认为舍入最大值更安全(对值进行较小的增量更改)。如果您有其他列来指定排序,则可以选择“第一”或“最后”列。
推荐阅读
- python - python Pandas多处理池在使用drop函数后不起作用
- tinymce - Uncaught TypeError: Cannot read properties of undefined (reading 'paste')...但是为什么呢?
- php - Php 在 datetime_local 选择器中禁用过去的几天
- spring - 一对一双向映射的问题
- python - 对python中三个数组的输入求和
- java - 杰克逊 json 枚举没有正确反序列化
- python-3.x - 为什么这个while循环在Python中永远不会停止
- python - 并行化应用 Pandas
- python - 在 Ubuntu 20.04、Errno 2 上安装 Airflow Pip
- python - DeepLearning4J:权重数组的形状错误