SQL13 计算商城中2021年每月的GMV

  • 数据
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', 15900, 2, 1),(301002, 101, '2021-10-01 11:00:00', 15900, 2, 1),(301003, 102, '2021-10-02 10:00:00', 34500, 8, 0),(301004, 103, '2021-10-12 10:00:00', 43500, 9, 1),(301005, 105, '2021-11-01 10:00:00', 31900, 7, 1),(301006, 102, '2021-11-02 10:00:00', 24500, 6, 1),(391007, 102, '2021-11-03 10:00:00', -24500, 6, 2),(301008, 104, '2021-11-04 10:00:00', 55500, 12, 0);
  • 题目
 场景逻辑说明:用户将购物车中多件商品一起下单时,订单总表会生成一个订单(但此时未付款,status-订单状态为0,表示待付款);当用户支付完成时,在订单总表修改对应订单记录的status-订单状态为1,表示已付款;若用户退货退款,在订单总表生成一条交易总金额为负值的记录(表示退款金额,订单号为退款单号,status-订单状态为2表示已退款)。 问题:请计算商城中2021年每月的GMV,输出GMV大于10w的每月GMV,值保留到整数。注:GMV为已付款订单和未付款订单两者之和。结果按GMV升序排序。输出示例:
示例数据输出如下:
month   GMV
2021-10   109800
2021-11   111900
解释:
2021年10月有3笔已付款的订单,1笔未付款订单,总交易金额为109800;2021年11月有2笔已付款订单,1笔未付款订单,
总交易金额为111900(还有1笔退款订单由于已计算了付款的订单金额,无需计算在GMV中)。
  • SQL
 select date_format(event_time,'%Y-%m') month,round(sum(total_amount)) gmvfrom tb_order_overallwhere year(event_time)='2021'and status in(0,1)group by date_format(event_time,'%Y-%m') having GMV>100000order by gmv asc;

SQL14 统计2021年10月每个退货率不大于0.5的商品各项指标

  • 数据
DROP TABLE IF EXISTS tb_user_event;
CREATE TABLE tb_user_event (id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',uid INT NOT NULL COMMENT '用户ID',product_id INT NOT NULL COMMENT '商品ID',event_time datetime COMMENT '行为时间',if_click TINYINT COMMENT '是否点击',if_cart TINYINT COMMENT '是否加购物车',if_payment TINYINT COMMENT '是否付款',if_refund TINYINT COMMENT '是否退货退款'
) CHARACTER SET utf8 COLLATE utf8_bin;INSERT INTO tb_user_event(uid, product_id, event_time, if_click, if_cart, if_payment, if_refund) VALUES(101, 8001, '2021-10-01 10:00:00', 0, 0, 0, 0),(102, 8001, '2021-10-01 10:00:00', 1, 0, 0, 0),(103, 8001, '2021-10-01 10:00:00', 1, 1, 0, 0),(104, 8001, '2021-10-02 10:00:00', 1, 1, 1, 0),(105, 8001, '2021-10-02 10:00:00', 1, 1, 1, 0),(101, 8002, '2021-10-03 10:00:00', 1, 1, 1, 0),(109, 8001, '2021-10-04 10:00:00', 1, 1, 1, 1);
  • 题目
 问题:请统计2021年10月每个有展示记录的退货率不大于0.5的商品各项指标,注:商品点展比=点击数÷展示数;加购率=加购数÷点击数;成单率=付款数÷加购数;退货率=退款数÷付款数,当分母为0时整体结果记为0,结果中各项指标保留3位小数,并按商品ID升序排序。 输出示例:
示例数据的输出结果如下product_id   ctr   cart_rate   payment_rate   refund_rate
8001   0.833   0.800   0.750   0.333
8002   1.000   1.000   1.000   0.000解释:
在2021年10月商品8001被展示了6次,点击了5次,加购了4次,付款了3次,退款了1次,因此点击率为5/6=0.833,加购率为4/5=0.800,
成单率为3/4=0.750,退货率为1/3=0.333(保留3位小数);
  • SQL
 select product_id,round(sum(if_click)/count(product_id),3) ctr,if(sum(if_click)=0,0,round(sum(if_cart)/sum(if_click),3)) cart_rate,if(sum(if_cart)=0,0,round(sum(if_payment)/sum(if_cart),3)) payment_rate,if(sum(if_payment)=0,0,round(sum(if_refund)/sum(if_payment),3)) refund_ratefrom tb_user_eventwhere date_format(event_time,'%Y-%m')='2021-10'group by product_id having refund_rate<=0.5order by product_id asc

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

  • 数据
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);
  • 题目
 场景逻辑说明:用户将购物车中多件商品一起下单时,订单总表会生成一个订单(但此时未付款,status-订单状态为0表示待付款),在订单明细表生成该订单中每个商品的信息;当用户支付完成时,在订单总表修改对应订单记录的status-订单状态为1表示已付款;若用户退货退款,在订单总表生成一条交易总金额为负值的记录(表示退款金额,订单号为退款单号,status-订单状态为2表示已退款)。问题:请计算2021年10月以来店铺901中商品毛利率大于24.9%的商品信息及店铺整体毛利率。注:商品毛利率=(1-进价/平均单件售价)*100%;
店铺毛利率=(1-总进价成本/总销售收入)*100%。
结果先输出店铺毛利率,再按商品ID升序输出各商品毛利率,均保留1位小数。输出示例:
示例数据的输出结果如下:
product_idprofit_rate
店铺汇总   31.0%
8001   29.4%
8003   33.3%
解释:
店铺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%
  • SQL
 select if(product_id is null ,'店铺汇总',product_id),concat(round(profit_rate*100,1),'%') from (select product_id,(1-sum(total_in_price)/sum(total_sales_ripec)) profit_ratefrom (select dtl.product_id,info.in_price*cnt total_in_price,price*cnt total_sales_ripecfrom tb_order_detail dtljoin tb_product_info info on dtl.product_id=info.product_idjoin tb_order_overall oa on oa.order_id=dtl.order_idwhere 1=1and oa.status=1and info.shop_id='901'and event_time >= '2021-10-01 00:00:00')tgroup by product_id with rolluphaving profit_rate > 0.249 OR product_id IS NULLorder by product_id asc
) t;-- coalesce(product_id,'店铺汇总')

SQL16 零食类商品中复购率top3高的商品

  • 数据
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;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, '零食', 60, 1000, '2020-01-01 10:00:00'),(8002, 901, '零食', 140, 500, '2020-01-01 10:00:00'),(8003, 901, '零食', 160, 500, '2020-01-01 10:00:00');INSERT INTO tb_order_overall(order_id, uid, event_time, total_amount, total_cnt, `status`) VALUES(301001, 101, '2021-09-30 10:00:00', 140, 1, 1),(301002, 102, '2021-10-01 11:00:00', 235, 2, 1),(301011, 102, '2021-10-31 11:00:00', 250, 2, 1),(301003, 101, '2021-11-02 10:00:00', 300, 2, 1),(301013, 105, '2021-11-02 10:00:00', 300, 2, 1),(301005, 104, '2021-11-03 10:00:00', 170, 1, 1);INSERT INTO tb_order_detail(order_id, product_id, price, cnt) VALUES(301001, 8002, 150, 1),(301011, 8003, 200, 1),(301011, 8001, 80, 1),(301002, 8001, 85, 1),(301002, 8003, 180, 1),(301003, 8002, 140, 1),(301003, 8003, 180, 1),(301013, 8002, 140, 2),(301005, 8003, 180, 1);
  • 题目
 场景逻辑说明:用户将购物车中多件商品一起下单时,订单总表会生成一个订单(但此时未付款, status-订单状态-订单状态为0表示待付款),在订单明细表生成该订单中每个商品的信息;当用户支付完成时,在订单总表修改对应订单记录的status-订单状态-订单状态为1表示已付款;若用户退货退款,在订单总表生成一条交易总金额为负值的记录(表示退款金额,订单号为退款单号,订单状态为2表示已退款)。问题:请统计零食类商品中复购率top3高的商品。注:复购率指用户在一段时间内对某商品的重复购买比例,复购率越大,则反映出消费者对品牌的忠诚度就越高,也叫回头率
此处我们定义:某商品复购率 = 近90天内购买它至少两次的人数 ÷ 购买它的总人数
近90天指包含最大日期(记为当天)在内的近90天。结果中复购率保留3位小数,并按复购率倒序、商品ID升序排序输出示例:
示例数据的输出结果如下:
product_id   repurchase_rate
8001   1.000
8002   0.500
8003   0.333
解释:
商品8001、8002、8003都是零食类商品,8001只被用户102购买了两次,复购率1.000;
商品8002被101购买了两次,被105购买了1次,复购率0.500;
商品8003被102购买两次,被101和105各购买1次,复购率为0.333。
  • SQL
select product_id,round(avg(cnt_uid),3) ratio from (select uid,product_id, if(count(distinct order_id)>=2,1,0) cnt_uid from (select dtl.order_id,oa.uid,dtl.product_idfrom tb_order_detail dtljoin tb_product_info info on dtl.product_id=info.product_idjoin tb_order_overall oa on oa.order_id=dtl.order_idwhere 1=1and oa.status in(0,1)and info.tag='零食'and event_time >= date_sub((select max(event_time) from tb_order_overall),interval 89 day)) tgroup by product_id,uid) t group by product_idorder by ratio desc,product_idlimit  3;

SQL17 10月的新户客单价和获客成本

  • 数据
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;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, '日用', 60, 1000, '2020-01-01 10:00:00'),(8002, 901, '零食', 140, 500, '2020-01-01 10:00:00'),(8003, 901, '零食', 160, 500, '2020-01-01 10:00:00'),(8004, 902, '零食', 130, 500, '2020-01-01 10:00:00');INSERT INTO tb_order_overall(order_id, uid, event_time, total_amount, total_cnt, `status`) VALUES(301002, 102, '2021-10-01 11:00:00', 235, 2, 1),(301003, 101, '2021-10-02 10:00:00', 300, 2, 1),(301005, 104, '2021-10-03 10:00:00', 160, 1, 1);INSERT INTO tb_order_detail(order_id, product_id, price, cnt) VALUES(301002, 8001, 85, 1),(301002, 8003, 180, 1),(301003, 8004, 140, 1),(301003, 8003, 180, 1),(301005, 8003, 180, 1);
  • 题目
 问题:请计算2021年10月商城里所有新用户的首单平均交易金额(客单价)和平均获客成本(保留一位小数)。注:订单的优惠金额 = 订单明细里的{该订单各商品单价×数量之和} - 订单总表里的{订单总金额} 。输出示例:
示例数据的输出结果如下
avg_amount   avg_cost
231.7   23.3
解释:
2021年10月有3个新用户,102的首单为301002,订单金额为235,商品总金额为85+180=265,优惠金额为30;
101的首单为301003,订单金额为300,商品总金额为140+180=320,优惠金额为20;
104的首单为301005,订单金额为160,商品总金额为180,优惠金额为20;
平均首单客单价为(235+300+160)/3=231.7,平均获客成本为(30+20+20)/3=23.3
  • SQL
-- 所有新用户及首单select uid,order_id,total_amountfrom tb_order_overall oa1where event_time =(select min(event_time) from tb_order_overall oa2 where oa1.uid=oa2.uid)
and date_format(event_time,'%Y-%m')='2021-10'; -- 订单总金额
select order_id,sum(price)
from tb_order_detail
group by order_id;select round(sum(total_amount_coupon)/count(*),1) avg_amount,
round(sum(total_amount-total_amount_coupon)/count(*),1) avg_cost  from( select uid,order_id,total_amount total_amount_couponfrom tb_order_overall oa1where event_time =(select min(event_time) from tb_order_overall oa2 where oa1.uid=oa2.uid)and date_format(event_time,'%Y-%m')='2021-10')t1
join
(select order_id,sum(price) total_amountfrom tb_order_detailgroup by order_id) t2 on t1.order_id=t2.order_id;

SQL18 店铺901国庆期间的7日动销率和滞销率

完全不会,看了题解要用不等式连接

  • 数据
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;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, '日用', 60, 1000, '2020-01-01 10:00:00'),(8002, 901, '零食', 140, 500, '2020-01-01 10:00:00'),(8003, 901, '零食', 160, 500, '2020-01-01 10:00:00');INSERT INTO tb_order_overall(order_id, uid, event_time, total_amount, total_cnt, `status`) VALUES(301004, 102, '2021-09-30 10:00:00', 170, 1, 1),(301005, 104, '2021-10-01 10:00:00', 160, 1, 1),(301003, 101, '2021-10-02 10:00:00', 300, 2, 1),(301002, 102, '2021-10-03 11:00:00', 235, 2, 1);INSERT INTO tb_order_detail(order_id, product_id, price, cnt) VALUES(301004, 8002, 180, 1),(301005, 8002, 170, 1),(301002, 8001, 85, 1),(301002, 8003, 180, 1),(301003, 8002, 150, 1),(301003, 8003, 180, 1);
  • 题目
 问题:请计算店铺901在2021年国庆头3天的7日动销率和滞销率,结果保留3位小数,按日期升序排序。注:动销率定义为店铺中一段时间内有销量的商品占当前已上架总商品数的比例(有销量的商品/已上架总商品数)。滞销率定义为店铺中一段时间内没有销量的商品占当前已上架总商品数的比例。(没有销量的商品/已上架总商品数)。只要当天任一店铺有任何商品的销量就输出该天的结果,即使店铺901当天的动销率为0。 输出示例:
示例数据的输出结果如下:
dt   sale_rate   unsale_rate
2021-10-01   0.333   0.667
2021-10-02   0.667   0.333
2021-10-03   1.000   0.000
解释:
10月1日的近7日(9月25日---10月1日)店铺901有销量的商品有8002,截止当天在售商品数为3,动销率为0.333,滞销率为0.667;
10月2日的近7日(9月26日---10月2日)店铺901有销量的商品有8002、8003,截止当天在售商品数为3,动销率为0.667,滞销率为0.333;
10月3日的近7日(9月27日---10月3日)店铺901有销量的商品有8002、8003、8001,截止当天店铺901在售商品数为3,动销率为1.000,
滞销率为0.000;
  • SQL1
SELECT dt, ROUND(cnt / total_cnt, 3) AS sale_rate, ROUND(1 - cnt / total_cnt, 3) AS unsale_rate
FROM
(SELECT DISTINCTDATE(event_time) AS dt,(SELECT COUNT(DISTINCT (IF(shop_id != 901, null, product_id)))FROM tb_order_overallJOIN tb_order_detail USING (order_id)JOIN tb_product_info USING (product_id)WHERE TIMESTAMPDIFF(DAY, event_time, to1.event_time) BETWEEN 0 AND 6-- 当是10.1号时,统计的是订单表1号及之前已售出的产品id-- 当是10.3号时,统计的是订单表3号及之前已售出的产品id) AS cnt,(SELECT COUNT(DISTINCT product_id)FROM tb_product_infoWHERE shop_id = 901-- 数据刚好都是3,所以结果正确) AS total_cntFROM tb_order_overall to1WHERE DATE(event_time) BETWEEN '2021-10-01' AND '2021-10-03'
) AS t0
ORDER BY dt;
  • SQL2
/*问题:请计算店铺901 WHERE shop_id=901
在2021年国庆头3天的7日动销率和滞销率,结果保留3位小数,
按日期升序排序。    ORDER BY DATE(event_time) ASC
注:
动销率定义为店铺中一段时间内有销量的商品占当前已上架总商品数的比例(有销量的商品/已上架总商品数)。      COUNT(DISTINCT product_id)/BIT_COUNT(DISTINCT produc_id)
滞销率定义为店铺中一段时间内没有销量的商品占当前已上架总商品数的比例。(没有销量的商品/已上架总商品数)。
只要当天任一店铺有任何商品的销量就输出该天的结果,即使店铺901当天的动销率为0。
需要获取每天出售了哪些商品,继而退出前七天的商品种类数 可以用where exists 来表示。
*/
WITH tmp AS(SELECT DATE(too1.event_time) AS sale_day, tod1.product_id ,tpi1.shop_idFROM tb_order_detail AS tod1 LEFT JOIN tb_order_overall AS too1ON tod1.order_id = too1.order_idLEFT JOIN tb_product_info AS tpi1ON tod1.product_id = tpi1.product_id) -- 这就是一个简单的链接查询,把三个表链接起来了
SELECT   t1.sale_day, ROUND( COUNT(DISTINCT CASE WHEN t2.shop_id=901 THEN t2.product_id ELSE NULL END) -- 为了实现“只要当天任一店铺有任何商品的销量就输出该天的结果”这一条件就不能在where中将其他店铺的记录删去,可以放在CASE 表达式中,不是901则不计。/(SELECT COUNT(DISTINCT product_id) FROM tb_product_info WHERE shop_id=901 AND DATE(release_time)<=t1.sale_day),3) AS sale_rate-- 一个子查询查询901店铺当天一共上架了多少商品, ROUND(1-COUNT(DISTINCT CASE WHEN t2.shop_id=901 THEN t2.product_id ELSE NULL END)/(SELECT COUNT(DISTINCT product_id) FROM tb_product_info WHERE shop_id=901 AND DATE(release_time)<=t1.sale_day),3) AS unsale_rate-- 动销率和滞消率相加正好等于1FROM tmp AS t1 LEFT JOIN tmp AS t2ON t2.sale_day BETWEEN DATE_SUB(t1.sale_day, INTERVAL 6 DAY) AND t1.sale_day-- 用自连接的方法获得前7天的产品销售情况。WHERE t1.sale_day BETWEEN '2021-10-01' AND '2021-10-03'GROUP BY t1.sale_dayORDER BY t1.sale_day ASC
  • SQL3
-- 国庆前3天
with t1 as
(
select date(event_time) dt
from tb_order_overall
where date(event_time) between '2021-10-01' and '2021-10-03'
group by dt
),
-- 901 25 26 27 28 29 30 1 2 3 这几天的有效订单
t2 as
(
select date(oa.event_time) dt,info.shop_id, dtl.product_idfrom tb_order_detail dtljoin tb_product_info info on dtl.product_id=info.product_idjoin tb_order_overall oa on oa.order_id=dtl.order_idwhere info.shop_id='901' and oa.status='1'and date(oa.event_time) between '2021-09-25' and '2021-10-03'order by dt asc
)
select dt, round(cnt_sale/cnt_all,3) sale_rate,1-round(cnt_sale/cnt_all,3) unsale_rate from
(select t1.dt,count(distinct t2.product_id) cnt_sale,
--   count(distinct
--         case
--           when t2.shop_id='901' then t2.product_id else null
--         end )cnt_sale,(select count(info.product_id) from tb_product_info info where info.shop_id='901' and date(info.release_time) <= t1.dt) cnt_allfrom t1 left join t2 on datediff(t1.dt,t2.dt) between 0 and 6group by t1.dt
) t order by dt asc| 2021-10-01 |
| 2021-10-02 |
| 2021-10-03 | 2021-09-30 |     901 |       8002 |
| 2021-10-01 |     901 |       8002 |
| 2021-10-02 |     901 |       8002 |
| 2021-10-02 |     901 |       8003 |
| 2021-10-03 |     901 |       8001 |
| 2021-10-03 |     901 |       8003 || 2021-10-01 | 2021-09-30 |     901 |       8002 |
| 2021-10-01 | 2021-10-01 |     901 |       8002 |-- 10.1及之前
| 2021-10-02 | 2021-09-30 |     901 |       8002 |
| 2021-10-02 | 2021-10-01 |     901 |       8002 |
| 2021-10-02 | 2021-10-02 |     901 |       8003 |
| 2021-10-02 | 2021-10-02 |     901 |       8002 |-- 10.2及之前
| 2021-10-03 | 2021-09-30 |     901 |       8002 |
| 2021-10-03 | 2021-10-01 |     901 |       8002 |
| 2021-10-03 | 2021-10-02 |     901 |       8003 |
| 2021-10-03 | 2021-10-02 |     901 |       8002 |
| 2021-10-03 | 2021-10-03 |     901 |       8003 |
| 2021-10-03 | 2021-10-03 |     901 |       8001 |-- 10.3及之前

牛客网SQL刷题四-电商场景(某东商城)相关推荐

  1. 牛客网SQL刷题笔记(MySQL)

    牛客网SQL刷题笔记(MySQL) 此博客集合LeetCode.牛客网常见的题型及其解法,侵删 目录 牛客网SQL刷题笔记(MySQL) 类型1:查找排名第几的数据 SQL2 查找入职员工时间排名倒数 ...

  2. sql里查询一个组和组的用户数怎么查?_【牛客网SQL刷题】留存率怎么算?

    抽空刷了牛客网SQL实战72题,最后几道以牛客网为例的题目还挺有挑战性,在此记录 统计时间段新用户次日留存率 每日的次日留存率 每日的新用户数 每日新用户的次日留存 求新登录用户次日留存 表login ...

  3. 牛客网SQL刷题问题汇总

    目录 1.选取字段为[奇数或偶数问题] 2.[排序问题] 3.MySQL[新建表.修改表] 4.对于表批量[插入数据],如果数据已经存在,则忽略 5.新建一个表,表中字段内容从另一个表导入 6.[索引 ...

  4. 牛客网SQL刷题笔记总结

    非技术快速入门 1.基础查询 (1)基础查询 查询单列:查询所需的列名写在 SELECT 关键字之后,FROM 关键字指出从哪个表中查询数据. select device_id from user_p ...

  5. 牛客网SQL刷题二-某音短视频

    SQL1 各个视频的平均完播率 数据 DROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video ...

  6. 牛客网Veirlog刷题答案目录(持续更新)

    牛客网Veirlog刷题答案目录(持续更新) 基础篇 进阶篇 基础篇 1.VL1--四选一多路选择器 2.VL2--异步复位的串联T触发器 3.VL3--奇偶校验 4.VL4--移位运算与乘法 5.V ...

  7. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类...

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概 ...

  8. 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...

    不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...

  9. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

最新文章

  1. Opencv进行人脸检测(改进)
  2. 最新发布丨金融新基建系列报告:银行业六大中期趋势展望
  3. 技术内参 | 数据分析,如何解决精度丢失的问题?
  4. Altium designer快捷键汇总
  5. 7-37 整数分解为若干项之和(20 分)
  6. java web开发技术大_2021年六大javaweb开发主流技术
  7. python变量名称跟着循环_python在循环中存储每次迭代使用不同名称的输入变量
  8. Hibernate之ID生成规则
  9. mysql vc运行库_VC++运行库安装
  10. uygurqa输入法android,uygurqa维语输入法2021
  11. 企业微信小程序开发流程
  12. matlab读取文本文件----textscan
  13. 七腾OA办公平台解决方案
  14. python 身份证校验
  15. 0基础看-最大似然函数,原理,基本概念,例子
  16. Navigation Bar的背景图片设置
  17. ue4创建一个游戏模式Game mode
  18. .Net iTextSharp 给Pdf添加图片水印
  19. iOS 基于 AVFoundation 制作的用于剪辑视频项目
  20. 中职计算机英语教学计划,中职英语基础模块1教学计划.docx

热门文章

  1. BurpSuite--Proxy详解
  2. 高等数学求导积分公式
  3. select下拉选项禁用
  4. Python金融学-风险中性测度
  5. QtScrcpy手机投屏电脑利器连接Android设备
  6. win10企业版LTSC-1809无法访问共享文件
  7. 巨儒艮、漂泊信天翁……这位90后中科院动物所研究员用日历讲述“物种故事”...
  8. java实现冒泡排序完整版
  9. Git首次提交代码到远程仓库时,出现fatal: unable to access ‘https://github.com/xxx/xxx.git/‘
  10. Method.invoke