SQL中数据小数处理(向上取整、向下取整、四舍五入)

哟,你说SQL里怎么处理小数,这事儿吧,还真得说道说道。

四舍五入这事儿,Oracle那边用ROUND函数。
比如你有个数1 2 .5 6 ,用ROUND(1 2 .5 6 , 0)就能变成1 3 注意啊,第二个参数是控制小数位数的,0就是整数位,直接舍入。
Hive那边也是ROUND函数,但用的时候得注意,它好像至少要你指定个小数位,哪怕是0也得写上,像ROUND(1 2 .5 6 , 0)这样。

向下取整,Oracle用FLOOR,比如FLOOR(1 2 .5 6 )就得到1 2 Hive那边也是FLOOR,用法一样,FLOOR(1 2 .5 6 )也是1 2
向上取整,Oracle用CEIL,比如CEIL(1 2 .5 6 )就得到1 3 Hive那边叫CEILING,名字不一样,但功能一样,CEILING(1 2 .5 6 )也是1 3
说实话,这事儿我当时也没想明白为啥Oracle和Hive名字不一样,CEIL和CEILING感觉就是一回事儿。
但关键是,ROUND就是四舍五入,FLOOR就是向下取整,CEIL(或CEILING)就是向上取整,这得记牢。
SQL查询里处理小数,用这些函数就灵活多了。

sql中除法怎么写

除法运算用/实现,行为看数据类型。

整数除法直接舍去小数,比如1 0/3 得3 浮点除法保留小数,比如1 0/3 .5 得2 .8 5 7
除0会报错,-1 0/3 得-3 想保留小数用ROUND,比如ROUND(1 0/3 .5 ,2 )得2 .8 6
MySQL和PostgreSQL规矩跟你说的一样。
SQL Server整数除法类似,但可以CAST类型。

Oracle默认浮点除法,整数除法得用TRUNC。

计算平均值保留小数: SELECT ROUND(SUM(score)/COUNT(),2 ) AS avg_score FROM students;
避免整数除法: SELECT total/CAST(count AS FLOAT) FROM metrics;
除法记住这几点就行。

SQL 数值函数如何实现取整?

哎,这SQL取整的事儿,我当年刚上班的时候也头疼过。
给你讲讲我踩过的坑。

那年头,我们公司做电商,搞活动,价格搞促销。
有个场景,满减,比如满1 00减1 0,凑单的时候,凑到9 9 .9 ,这咋算?向上取整呗。
我们用MySQL,就用CEILING(9 9 .9 ),结果返回1 00,减1 0正好。
后来换到Oracle的系统,他们那叫CEIL,结果一样,没问题。

还有个坑是负数。
记得有一次算库存,某个商品负数了,系统显示-5 0.3 ,我们向上取整,以为是变成-5 0,结果Oracle返回的是-5 0,MySQL也是。
后来发现,数据库这“向上”就是往零那边靠,跟咱们想的不太一样。
所以写代码前,得先搞清楚数据库咋取。

再比如四舍五入。
我们有个报表,金额要保留两位小数。
有时候5 要进位,有时候不进。
用ROUND(金额,2 )就行,简单明了。
但有一次,数据量特别大,几百M的数据,直接在SQL里写ROUND,卡死过几次。
后来技术总监教我们,尽量用数据库自带函数,别用Java、Python再去算一遍。
确实,数据库处理这些数值计算,优化得比较好。

截断小数,这个我碰得少。
后来有个项目,数据清洗,要求直接去掉小数,不四舍五入。
MySQL有TRUNCATE,挺好用。
SQL Server没有,就硬着头皮用ROUND(数值,0,1 ),一开始还搞错,后来才明白,第二个参数是舍入方式,第三个参数是精度,设置为1 就是截断。
搞了个晚上,差点没睡好。

总之,这事儿吧,别想得太复杂。
场景对应着函数,负数注意方向,数据量大少用应用层处理。
我这些年就踩过这几个坑,希望对你有用。