题解 | #某店铺的各商品毛利率及店铺整体毛利率#
某店铺的各商品毛利率及店铺整体毛利率
https://www.nowcoder.com/practice/65de67f666414c0e8f9a34c08d4a8ba6
#需求:计算2021年10月以来店铺901中商品毛利率大于24.9%的商品信息及店铺整体毛利率
#输出:商品ID、毛利率,店铺汇总行
#要求:先输出店铺毛利率,再输出各商品毛利率,按商品ID升序,保留1位小数
#特殊点:1、输出信息中要有一行店铺整体的毛利率信息;2、原表信息中没有平均单件售价
#思路:问题分解
#1、商品毛利率和店铺毛利率计算公式实际是同一个,只是一个用的总价,一个用的单价
#2、要用到的数据:product_id、price、in_price、event_time,涉及三个表,做表链接
#3、2021年10月以来店铺901:where shop_id=901 and date(event_time)>=2021-10-01
#4、product_id列加上汇总行:group by product_id with rollup
#5、商品毛利率大于24.9:having
select ifnull(product_id,'店铺汇总') product_id,
concat(round((1-sum(in_price*cnt)/sum(price*cnt))*100,1),"%") profit_rate
#算毛利只看已售商品量的进价成本,所以进货价和单价都对标cnt下单量
#平均单件售价为总售额/单量,进价/平均单件售价=in_price/(sum(price*cnt)/sum(cnt))=in_price*sum(cnt)/sum(price*cnt),而一商品的in_price是一个固定值,所以in_price可以乘进sum里简写为 =sum(in_price*cnt)/sum(price*cnt)
from(
select product_id,price,cnt,in_price
from tb_order_detail
join tb_product_info using(product_id)
join tb_order_overall using(order_id)
where shop_id=901 and date(event_time)>="2021-10-01"
) t1
group by product_id
with rollup
having profit_rate>24.9 or product_id is null
#group by+with汇总的字段此时product_id值为null,它们先于select执行,要到select步骤时才会赋值为店铺汇总,这里为了保留它加了个or条件
order by product_id
#null值参与order by 排序,null值会默认为最小值,升序第一个,降序最后一个
#这里的group by和order by 不能简写指代,要直接使用product_id,不然汇总行不会参与这两步运算

 
 
 投递大连飞创信息技术有限公司等公司10个岗位
投递大连飞创信息技术有限公司等公司10个岗位