首页 > 试题广场 >

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

[编程题]某店铺的各商品毛利率及店铺整体毛利率
  • 热度指数:128432 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

商品信息表tb_product_info


(product_id-商品ID, shop_id-店铺ID, tag-商品类别标签, in_price-进货价格, quantity-进货数量, release_time-上架时间)


订单总表tb_order_overall


(order_id-订单号, uid-用户ID, event_time-下单时间, total_amount-订单总金额, total_cnt-订单商品总件数, status-订单状态)


订单明细表tb_order_detail

(order_id-订单号, product_id-商品ID, price-商品单价, cnt-下单数量)


场景逻辑说明

  • 用户将购物车中多件商品一起下单时,订单总表会生成一个订单(但此时未付款,status-订单状态0表示待付款),在订单明细表生成该订单中每个商品的信息;

  • 当用户支付完成时,在订单总表修改对应订单记录的status-订单状态1表示已付款;

  • 若用户退货退款,在订单总表生成一条交易总金额为负值的记录(表示退款金额,订单号为退款单号,status-订单状态为2表示已退款)。


问题:请计算2021年10月以来店铺901中商品毛利率大于24.9%的商品信息及该店铺整体毛利率

:商品毛利率=(1-进价/平均单件售价)*100%;
       店铺毛利率=(1-总进价成本/总销售收入)*100%。
       结果先输出店铺毛利率,再按商品ID升序输出各商品毛利率,均保留1位小数。

输出示例
示例数据的输出结果如下:

解释:
店铺901有两件商品8001和8003;8001售出了3件,销售总额为25500,进价总额为18000,毛利率为1-18000/25500=29.4%,8003售出了1件,售价为18000,进价为12000,毛利率为33.3%;
店铺卖出的这4件商品总销售额为43500,总进价为30000,毛利率为1-30000/43500=31.0%
示例1

输入

DROP TABLE IF EXISTS tb_order_overall;
CREATE TABLE tb_order_overall (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    order_id INT NOT NULL COMMENT '订单号',
    uid INT NOT NULL COMMENT '用户ID',
    event_time datetime COMMENT '下单时间',
    total_amount DECIMAL NOT NULL COMMENT '订单总金额',
    total_cnt INT NOT NULL COMMENT '订单商品总件数',
    `status` TINYINT NOT NULL COMMENT '订单状态'
) CHARACTER SET utf8 COLLATE utf8_bin;

INSERT INTO tb_order_overall(order_id, uid, event_time, total_amount, total_cnt, `status`) VALUES
  (301001, 101, '2021-10-01 10:00:00', 30000, 3, 1),
  (301002, 102, '2021-10-01 11:00:00', 23900, 2, 1),
  (301003, 103, '2021-10-02 10:00:00', 31000, 2, 1);

DROP TABLE IF EXISTS tb_product_info;
CREATE TABLE tb_product_info (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    product_id INT NOT NULL COMMENT '商品ID',
    shop_id INT NOT NULL COMMENT '店铺ID',
    tag VARCHAR(12) COMMENT '商品类别标签',
    in_price DECIMAL NOT NULL COMMENT '进货价格',
    quantity INT NOT NULL COMMENT '进货数量',
    release_time datetime COMMENT '上架时间'
) CHARACTER SET utf8 COLLATE utf8_bin;

DROP TABLE IF EXISTS tb_order_detail;
CREATE TABLE tb_order_detail (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    order_id INT NOT NULL COMMENT '订单号',
    product_id INT NOT NULL COMMENT '商品ID',
    price DECIMAL NOT NULL COMMENT '商品单价',
    cnt INT NOT NULL COMMENT '下单数量'
) CHARACTER SET utf8 COLLATE utf8_bin;

INSERT INTO tb_product_info(product_id, shop_id, tag, in_price, quantity, release_time) VALUES
  (8001, 901, '家电', 6000, 100, '2020-01-01 10:00:00'),
  (8002, 902, '家电', 12000, 50, '2020-01-01 10:00:00'),
  (8003, 901, '3C数码', 12000, 50, '2020-01-01 10:00:00');

INSERT INTO tb_order_detail(order_id, product_id, price, cnt) VALUES
  (301001, 8001, 8500, 2),
  (301001, 8002, 15000, 1),
  (301002, 8001, 8500, 1),
  (301002, 8002, 16000, 1),
  (301003, 8002, 14000, 1),
  (301003, 8003, 18000, 1);

输出

店铺汇总|31.0%
8001|29.4%
8003|33.3%
头像 webary
发表于 2021-12-08 20:21:12
某店铺的各商品毛利率及店铺整体毛利率 明确题意: 计算2021年10月以来店铺901中商品毛利率大于24.9%的商品信息及店铺整体毛利率。 此处毛利率定义如下:商品毛利率=(1-进价/平均单件售价)*100%;店铺毛利率=(1-总进价成本/总销售收入)*100%。 结果先输出店铺毛利率,再按商品ID 展开全文
头像 无上清颜
发表于 2021-12-23 14:57:50
select '店铺汇总' as pproduct_id,concat(round((1-sum(in_price*cnt)/sum(price*cnt))*100,1),'%') as profit_rate from tb_product_info t join tb_order_overall 展开全文
头像 Alex_John
发表于 2022-01-18 13:46:45
题意 给你一张产品信息表,一张订单明细表,一张订单总表,请你查询出901店铺2021年10月份以来所有毛利率大于24.9%的商品信息和店铺的整体毛利率 思路 既然需要商品和店铺两种,那么我们直接将问题分为两个部分不就行了?所以我们可以先行查询店铺的整体毛利率 因为店铺毛利率 = (1 - 总进价成 展开全文
头像 骨碌圆
发表于 2022-02-09 18:56:47
本题用到三个知识点 在分组统计的基础上汇总 由此衍生出union()函数的排序 输出百分数,保留N位小数 知识点掌握后,则需要细心点,对数据进行筛选,此处需要拆解条件。 知识点1:分组统计的基础上汇总的两种解法 展开全文
头像 安哥拉兔很想回家
发表于 2022-01-29 15:21:10
临时表t 用于记录所有售出商品进价、销售价、数量、状态 再用店铺利润 union 商品利润 with t as( select t1.*, t3.in_price from tb_order_detail t1 left join tb_order_overall t2 on 展开全文
头像 通辽可汗克鸽勃
发表于 2021-12-14 17:28:45
不难,但是步骤繁琐,做题时要注意status,然后就是union和order by 的先后顺序了 在转变成百分比的时候括号特别多,不要少了 with tmp as (SELECT id, sum(in_price*if(status=2,-cnt,cnt)) as all_in, 展开全文
头像 jaime_
发表于 2021-12-15 14:12:52
select '店铺汇总' as product_id, concat(round((1-sum(cnt*in_price)/sum(cnt*price))*100,1),'%') profit_rate FROM tb_order_detail t3 LEFT JOIN tb_pro 展开全文
头像 LOLO很爱吃鱼
发表于 2022-03-23 21:03:56
题目真的很坑...比如说计算店铺总体的时候,不要求status=1,如果写了第三个样例不通过 WITH tmp AS (      SELECT td.product_id,   &nb 展开全文
头像 风雪行
发表于 2022-07-27 19:25:12
思路: 连表后根据shop_id分组, 然后求毛利率, 不同的是既要求某个商品的的毛利率, 又需要求该店铺的毛利率, 两种方法 使用with rollup(貌似只有mysql8.0支持), 该函数的功能是分组汇总统计, 举个例子, 根据product_id分组, 则会在分组的最后一行, 增加一行汇 展开全文
头像 南非独立日
发表于 2022-04-11 00:40:44
两个方案 第一:先计算店铺整体毛利率,再计算各商品毛利率,通过union结合。这个可以结合其他结果看下 第二:with rollup可以计算 group by的总计数据,因此可以通过这个函数得到店铺的值。这样得到的product_id是null,所以需要在 having的时候加上 or produc 展开全文