题解 | #某店铺的各商品毛利率及店铺整体毛利率#
某店铺的各商品毛利率及店铺整体毛利率
http://www.nowcoder.com/practice/65de67f666414c0e8f9a34c08d4a8ba6
本题用到三个知识点
- 在分组统计的基础上汇总
- 由此衍生出union()函数的排序
- 输出百分数,保留N位小数
知识点掌握后,则需要细心点,对数据进行筛选,此处需要拆解条件。
知识点1:分组统计的基础上汇总的两种解法
- 使用uion,将分组统计和汇总数据拼接起来
- 使用group by 分组标准 with rollup,直接得到汇总数据。但分组列名会出现空值,需要使用ifnull()函数来填充空值
eg:ifnull(product_id,'店铺汇总') product_id↓↓↓
知识点2:使用union()函数,order by只能在最后使用一次
如需要对各部分分别排序,代码如下
select * from (select * from table1 order by a desc)aa union all select * from (select * from table2 order by b)bb注:union可以使用任何select的语句,包括having
知识点3:输出百分数,保留1位小数
首先,让小数*100,得到数字a
然后,让数字a保留1位小数,使用round(a,1),得到数字b
最后,给小数加上百分号concat(b,'%')
注:concat(round(3/7*100,1),'%')>50,意为和50%比较
开始解题,首先筛选数据,需要满足条件
【问题】计算2021年10月以来店铺901中商品毛利率大于24.9%的商品信息及店铺整体毛利率
- 【条件1】2021年10月以来 -- date(event_time)>'20211001'
- 【条件2】店铺901 -- shop.id=901
- 【条件3】毛利率大于24.9%,计算毛利率需要知道【进价总成本】以及【销售收入】(这里忽略讲解为什么商品毛利率计算公式等于店铺毛利率计算公式)
-- 进价总成本=sum(in_price*cnt)
-- 销售收入=sum(price*cnt)
- 【条件4】由销售收入挖掘到隐藏条件 -- 商品已付款,status=1
为了提高写代码的速度,使用了with as(不懂的,百度下吧)
使用union写的代码↓↓↓
with t as( select p.product_id, p.in_price,d.price,d.cnt from tb_order_overall o left join tb_order_detail d on o.order_id = d.order_id left join tb_product_info p on p.product_id = d.product_id where o.status = 1 and date(o.event_time)>='2021-10-01' and p.shop_id = 901 ) select '店铺汇总' as product_id, concat(round((1-sum(in_price*cnt)/sum(price*cnt))*100,1),'%') as profit_rate from t union select * from (select product_id, concat(round((1-sum(in_price*cnt)/sum(price*cnt))*100,1),'%') as profit_rate from t group by product_id having profit_rate>24.9 order by product_id )t2 ;