题解 | #某店铺的各商品毛利率及店铺整体毛利率#

某店铺的各商品毛利率及店铺整体毛利率

https://www.nowcoder.com/practice/65de67f666414c0e8f9a34c08d4a8ba6

select '店铺汇总' as product_id, concat(round((1-sum(in_price*cnt)/sum(price*cnt))*100,1),'%') as profit_rate
from tb_order_overall join tb_order_detail using(order_id)
join tb_product_info using(product_id)
where date_format(event_time,'%Y%m')>='202110' and shop_id=901
union all
(select product_id,concat(round((1-avg(in_price)/(avg(price)))*100,1),'%') profit_rate
from tb_order_overall join tb_order_detail using(order_id)
join tb_product_info using(product_id)
where date_format(event_time,'%Y%m')>='202110' and shop_id=901
group by product_id
having (1-avg(in_price)/(avg(price)))*100 > 24.9
order by product_id)

分为两步来算,分别求得店铺和产品的值再汇总。
主要是搞明白公式计算。

若不想使用union all 可以使用 with rollup 来完成汇总。

select ifnull(product_id,'店铺汇总'),concat(round((1-sum(in_price*cnt)/sum(price*cnt))*100,1),'%') as profit_rate
from tb_order_overall join tb_order_detail using(order_id)
join tb_product_info using(product_id)
where date_format(event_time,'%Y%m')>='202110' and shop_id=901
group by product_id
with rollup
having case when product_id>0 then (1-avg(in_price)/(avg(price)))*100 > 29.4 else (1-avg(in_price)/(avg(price)))*100 > 0 end 
order by product_id

case when 在sql中真是有妙用。

全部评论

相关推荐

代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务