做了个促销功能,添加了阶梯满减功能,就是订单的金额满多少减少多少,就和现在的淘宝的双十一一双十二一样,满300减40这样的。使用自动测试和人工测试下了N单,需要验证下。或者数据分析师需要拿些数据,就涉及到了计算。
场景是这样的:有2张表,一张是订单表【order】一张是订单商品表【order_row】 ,订单表计算了订单的折扣后价格和实际支付价格,然后需要知道订单的总的未打折的价格只能计算订单商品表中商品的总和【不要问我这个架构是谁做的,问了就说不是我】。
先按照订单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取整操作:
函数主要是四舍五入
函数接受2个参数,第一个是需要计算的数据,第二个是要保留的小数点点位默认为0就是不保留。
实例:
函数主要是向下取整,就是直接抛弃小数位。
这个符合我们的需求:
floor(12345/300) => 4
函数主要是向上取整,就是抛弃小数整数加一
实例:
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;
结果:
这次就预习了取整的函数