四舍五入所有数字,但求和

时间:2019-12-20 23:31:20

标签: sql postgresql

说我有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

有什么简单的方法吗?

2 个答案:

答案 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