说我有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
有什么简单的方法吗?
答案 0 :(得分:4)
这是具有挑战性的。这是一种方法:
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;
Here是db <>小提琴。
基本上,这会将所有值四舍五入到小数点后两位(最大的一位除外)。为此,它从总数中减去四舍五入后的值之和。
注意:这会将多余的部分增加到最大值。可以将最小值取整,但我认为将最大值取整比较安全(对值的较小增量更改)。如果您还有其他列指定顺序,则可以选择“第一”或“最后”列。
答案 1 :(得分:1)
将所有值汇总为一个总和和一个数组,然后将数组展开回各自的行中。
SELECT
unnest(array_agg(round(ct.cash, 2))) AS cash,
round(sum(ct.cash), 2) AS total
FROM cash_table AS ct;
结果
cash | total
--------+---------
1993.77 | 10000.00
5015.57 | 10000.00
996.88 | 10000.00
1993.77 | 10000.00