logo
当前位置:首 页 > 编程技术 >后端开发 >mysql > 查看文章

MySQL数值取整计算

mysql, 后端开发, 编程技术 你是第2004个围观者 0条评论 供稿者: 标签:,

做了个促销功能,添加了阶梯满减功能,就是订单的金额满多少减少多少,就和现在的淘宝的双十一一双十二一样,满300减40这样的。使用自动测试和人工测试下了N单,需要验证下。或者数据分析师需要拿些数据,就涉及到了计算。

 

场景是这样的:有2张表,一张是订单表【order】一张是订单商品表【order_row】 ,订单表计算了订单的折扣后价格和实际支付价格,然后需要知道订单的总的未打折的价格只能计算订单商品表中商品的总和【不要问我这个架构是谁做的,问了就说不是我】。

 

0X0001

 

先按照订单id获取订单商品的总价;

aggregate_amount 是这个表的单个商品的总价,例如商品单价10元,买了2个 这个字段就是20.

SELECT
		SUM(order_row.aggregate_amount) AS sums,
		order_id
	FROM
		order_row
	GROUP BY
		order_ide

 

 

计算验证数据正确之后,开始做订单表的脚本设计

order的NO字段是订单号,随机生成的防止被“有心人”攻击。

order_id就是order表的id字段。

 

SELECT
	`order`. NO,
 
	orow.sums as '订单金额'
 
FROM
	`order`
LEFT JOIN (
	SELECT
		SUM(order_row.aggregate_amount) AS sums,
		order_id
	FROM
		order_row
	GROUP BY
		order_id
) orow ON orow.order_id = `order`.id

 

 

获取的结果如下:

 

 

添加上订单支付的金额核对下:

 

SELECT
	`order`. NO,
 
	orow.sums as '订单金额',
	`order`.paid_amount as '支付金额'
 
 
FROM
	`order`
LEFT JOIN (
	SELECT
		SUM(order_row.aggregate_amount) AS sums,
		order_id
	FROM
		order_row
	GROUP BY
		order_id
) orow ON orow.order_id = `order`.id

 

 

 

结果如下:

 

获取的数据表的脚本差不多了,开始做计算了:

 

先获取字段的整数差:

复习下MySQL取整操作:

ROUND( ) 函数用法

函数主要是四舍五入

函数接受2个参数,第一个是需要计算的数据,第二个是要保留的小数点点位默认为0就是不保留。

实例:

SELECT ROUND('123.456')
  123
 
 SELECT ROUND('123.654')
  124
 
   SELECT ROUND('123.456',2)
  123.46
 
 SELECT ROUND('123.654',2)
  123.65

 

 

FLOOR函数用法 

 

函数主要是向下取整,就是直接抛弃小数位。

 

这个符合我们的需求:

floor(12345/300) => 4

 

CEILING函数用法

函数主要是向上取整,就是抛弃小数整数加一

实例:

SELECT CEILING('123.456')
  124
 
 SELECT CEILING('123.654')
  124

 

 

我们使用了floor函数来计算

SELECT
	`order`. NO,
 
	orow.sums as '订单金额',
	`order`.paid_amount as '支付金额',
	(floor(orow.sums/1000)*300) as '预期望优惠',
(orow.sums-`order`.paid_amount) as '实际优惠',
 
	FROM_UNIXTIME(`order`.create_time)  as '创建时间'
 
FROM
	`order`
LEFT JOIN (
	SELECT
		SUM(order_row.aggregate_amount) AS sums,
		order_id
	FROM
		order_row
	GROUP BY
		order_id
) orow ON orow.order_id = `order`.id
 
LEFT JOIN pay_money on pay_money.order_id = `order`.id

 

结果如下:

 

 

最后添加下需要的where语句和order参数:

 

添加限定只有付款的用户而且订单金额要大于300的 再倒序列出:

 

SELECT
	`order`. NO,
 
	orow.sums as '订单金额',
	`order`.paid_amount as '支付金额',
	(ROUND(orow.sums/1000)*300) as '预定优惠',
(orow.sums-`order`.paid_amount) as '实际优惠',
	FROM_UNIXTIME(`order`.create_time) as '创建时间'
FROM
	`order`
LEFT JOIN (
	SELECT
		SUM(order_row.aggregate_amount) AS sums,
		order_id
	FROM
		order_row
	GROUP BY
		order_id
) orow ON orow.order_id = `order`.id
 
 
WHERE
  `order`.payment_status = 1
 AND orow.sums > 300
ORDER BY
	`order`.id DESC;

 

结果:

 

 

这次就预习了取整的函数

 

 

 

说说梦想,谈谈感悟 ,聊聊技术,有啥要说的来github留言吧 https://github.com/cjx2328

—— 陈 建鑫

陈建鑫
你可能也喜欢Related Posts
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容。站长联系:cjx2328#126.com(修改#为@)
Copyright ©ziao Studio All Rights Reserved. E-mail:cjx2328#126.com(#号改成@) 沪ICP备14052271号-3