题解 | #某宝店铺动销率与售罄率#
某宝店铺动销率与售罄率
https://www.nowcoder.com/practice/715dd44c994f45cb871afa98f1b77538
# 求每款的动销率、售罄率 # 动销率:有销售的SKU数量/在售的数量 # 售罄率:GMV/(总共价值) # 联结两张表,有销售的SKU数量也就是 sales_num 的求和,在售的数量也就是 inventory - 对应商品的售出数量 的求和 # GMV也就是 总商品交易额,是 sales_price 的求和,备货值是 tag_price * inventory- 对应商品的售出数量 的求和 # 错误理解 # 分别从两张表提取所需的字段 # 临时表0,联结两张表,因为是计算各个商品的细节,所以直接对标价、库存取最大值降维,对售出数和金额取总和,这样就知道一个商品的标价、初始库存、售出数、售出总金额 WITH temp_0 AS( SELECT style_id, item_id, MAX(tag_price) tag_price, MAX(inventory) inventory, SUM(sales_num) sales_num, SUM(sales_price) sales_price FROM product_tb JOIN sales_tb USING(item_id) GROUP BY style_id, item_id ORDER BY style_id, item_id ) # 主查询根据公式求。难点在于理解两个率。 # 动销率:有销售的SKU数量/在售的数量 。在售数量是指初始库存减去已售出数 # 售罄率:GMV/(总共价值)。GMV也就是售出总金额,总共备货价值是指初始库存*各自的吊牌价 SELECT style_id, #sales_num, inventory - sales_num inventory_now, sales_price gmv, tag_price * inventory total_price ROUND(SUM(sales_num) / SUM(inventory - sales_num) * 100, 2) 'pin_rate(%)', ROUND(SUM(sales_price) / SUM(tag_price * inventory) * 100, 2) 'sell-through_rate(%)' FROM temp_0 GROUP BY style_id ORDER BY style_id
踩的坑:
1.最开始以为在售数量是指初始库存数,但是不是。
2.备货值的理解错误,备货值是初始的库存*标价
要注意的是,如果直接求总和,比如对inventory求总和,会导致某一商品的库存数翻倍,这就论证了临时表0的必要性。可以把刚联结后的库存看作是开窗函数后的结果。