Postgre 地板更改值 postgresql

Postgre floor changes values postgresql

提问人:Cignitor 提问时间:6/14/2023 最后编辑:Cignitor 更新时间:6/14/2023 访问量:29

问:

我有以下疑问

with debug as (
    select kode_toko_dbo 
    , kode_toko_final
    , nama_toko_final
    , concat (point_category,' - ',point) poin_kategori
    , point
    , sum(total_do_qty) total_do_qty
    , sum(case when upper(replace(item_name,' ','')) ~ upper('^.*Classic.*(6|8)') then floor(total_do_qty::numeric /10)
        when upper(kategori_name_l1) = 'RB FASCIA' then (floor(total_do_qty::numeric /10))
        when upper(replace(item_name,' ','')) ~  upper('^.*Classic.*(3|4)\.5') then floor(total_do_qty::numeric /10)
        else 0 end) reward_toko
    from outputnya 
    group by 1,2,3,4,5
    --order by reward_toko desc 
    )
    select kode_toko_dbo 
    , kode_toko_final 
    , nama_toko_final 
    , poin_kategori
    , point
    , total_do_qty
    , reward_toko   
    from debug
    where kode_toko_final  in ('2012000044','2012000044')
    order by reward_toko desc 

它给出了以下结果:enter image description here

当我们偏离 时,它会返回正确的结果。841710841

当我们除以 时,它返回这是错误的。它返回.295010293295

如何解决此问题?

当我尝试以下查询时:

select 2950
, floor(2950::numeric / 10)
, floor(2950::numeric / 10) * 4 
limit 5 

它给了我正确的结果。

enter image description here

如何解决此问题?

PostgreSQL 数学 舍入 下限

评论

2赞 nacho 6/14/2023
因此,不要在总和内使用下限(或四舍五入),而是在值的总和之外使用
0赞 Cignitor 6/14/2023
为什么会这样@nacho?
0赞 Laurenz Albe 6/14/2023
在该表达式中,有一个返回 0 的分支。这很可能是造成这种差异的原因。我无法判断这是否是问题所在,因为我不知道您的数据。考虑为问题创建一个最小的独立再现器,这将允许重现和分析您的问题。CASEELSE
0赞 Cignitor 6/14/2023
我遵循@nacho建议,它奏效了。我只是不知道它为什么有效。是的,会的。 谢谢Laurenz Albe
1赞 nacho 6/14/2023
因为如果你有像 2.2 和 2.9 这样的十进制数,总和是 5.1,如果你做地板,你会得到 5。但是,如果首先,你做地板,你得到 2 和 2,总和是 4

答: 暂无答案