大数据SQL题39 国庆期间的7日动销率和滞销率

原题链接:http://practice.atguigu.cn/#/question/39/desc?qType=SQL

题目需求

动销率定义为品类商品中一段时间内有销量的商品占当前已上架总商品数的比例(有销量的商品/已上架总商品数)。

滞销率定义为品类商品中一段时间内没有销量的商品占当前已上架总商品数的比例。(没有销量的商品 / 已上架总商品数)。

只要当天任一店铺有任何商品的销量就输出该天的结果

从订单明细表(order_detail)和商品信息表(sku_info)表中求出国庆7天(指2021-10-01-2021-10-07)每天每个品类的商品的动销率和滞销率

期望结果如下(截取部分):

category_id(品类id)first_sale_rate<decimal(16,2)>(动销)first_unsale_rate<decimal(16,2)>(滞销)second_sale_rate<decimal(16,2)>(动销)second_unsale_rate<decimal(16,2)>(滞销)
11.000.000.500.50
20.750.250.750.25
30.250.750.750.25

需要用到的表:

订单明细表:order_detail

order_detail_id(订单明细id)order_id(订单id)sku_id(商品id)create_date(下单日期)price(商品单价)sku_num(商品件数)
1112021-09-302000.002
2132021-09-305000.005
221042020-10-026000.001
231052020-10-02500.0024
241062020-10-022000.005

商品信息表:sku_info

sku_id(商品id)name(商品名称)category_id(分类id)from_date(上架日期)price(商品价格)
1xiaomi 1012020-01-012000
6洗碗机22020-02-012000
9自行车32020-01-011000

解题思路

SELECT  t1.category_id,
        cast(sales_cnt_1/sku_cnt_1 AS decimal(16,2))     AS first_sale_rate,
        cast(1 - sales_cnt_1/sku_cnt_1 AS decimal(16,2)) AS first_unsale_rate,
        cast(sales_cnt_2/sku_cnt_2 AS decimal(16,2))     AS second_sale_rate,
        cast(1 - sales_cnt_2/sku_cnt_2 AS decimal(16,2)) AS second_unsale_rate,
        cast(sales_cnt_3/sku_cnt_3 AS decimal(16,2))     AS third_sale_rate,
        cast(1 - sales_cnt_3/sku_cnt_3 AS decimal(16,2)) AS third_unsale_rate,
        cast(sales_cnt_4/sku_cnt_4 AS decimal(16,2))     AS fourth_sale_rate,
        cast(1 - sales_cnt_4/sku_cnt_4 AS decimal(16,2)) AS fourth_unsale_rate,
        cast(sales_cnt_5/sku_cnt_5 AS decimal(16,2))     AS fifth_sale_rate,
        cast(1 - sales_cnt_5/sku_cnt_5 AS decimal(16,2)) AS fifth_unsale_rate,
        cast(sales_cnt_6/sku_cnt_6 AS decimal(16,2))     AS sixth_sale_rate,
        cast(1 - sales_cnt_6/sku_cnt_6 AS decimal(16,2)) AS sixth_unsale_rate,
        cast(sales_cnt_7/sku_cnt_7 AS decimal(16,2))     AS seventh_sale_rate,
        cast(1 - sales_cnt_7/sku_cnt_7 AS decimal(16,2)) AS seventh_unsale_rate
FROM
(
	SELECT  si.category_id,
	        COUNT(DISTINCT IF(od.create_date = '2021-10-01',od.sku_id,NULL)) AS sales_cnt_1,
	        COUNT(DISTINCT IF(od.create_date = '2021-10-02',od.sku_id,NULL)) AS sales_cnt_2,
	        COUNT(DISTINCT IF(od.create_date = '2021-10-03',od.sku_id,NULL)) AS sales_cnt_3,
	        COUNT(DISTINCT IF(od.create_date = '2021-10-04',od.sku_id,NULL)) AS sales_cnt_4,
	        COUNT(DISTINCT IF(od.create_date = '2021-10-05',od.sku_id,NULL)) AS sales_cnt_5,
	        COUNT(DISTINCT IF(od.create_date = '2021-10-06',od.sku_id,NULL)) AS sales_cnt_6,
	        COUNT(DISTINCT IF(od.create_date = '2021-10-07',od.sku_id,NULL)) AS sales_cnt_7
	FROM order_detail od
	JOIN sku_info si
	ON od.sku_id = si.sku_id
	WHERE od.create_date BETWEEN '2021-10-01' AND '2021-10-07'
	GROUP BY  si.category_id
) t1
LEFT JOIN
(
	SELECT  category_id,
	        COUNT(DISTINCT IF(from_date <= '2021-10-01',sku_id,NULL)) AS sku_cnt_1,
	        COUNT(DISTINCT IF(from_date <= '2021-10-02',sku_id,NULL)) AS sku_cnt_2,
	        COUNT(DISTINCT IF(from_date <= '2021-10-03',sku_id,NULL)) AS sku_cnt_3,
	        COUNT(DISTINCT IF(from_date <= '2021-10-04',sku_id,NULL)) AS sku_cnt_4,
	        COUNT(DISTINCT IF(from_date <= '2021-10-05',sku_id,NULL)) AS sku_cnt_5,
	        COUNT(DISTINCT IF(from_date <= '2021-10-06',sku_id,NULL)) AS sku_cnt_6,
	        COUNT(DISTINCT IF(from_date <= '2021-10-07',sku_id,NULL)) AS sku_cnt_7
	FROM sku_info
	WHERE from_date <= '2021-10-07'
	GROUP BY  category_id
) t2
ON t1.category_id = t2.category_id
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值