统计各品类最畅销的商品

统计各品类最畅销的商品

问题:
统计各品类售出商品的种类数和销量最好的商品

1- 数据准备
表1: t_order_detail (订单明细表)
	id(订单明细id), order_id(订单id), sku_id(商品id), create_date(订单创建日期), price(商品单价), quantity(商品数量)

表2: t_sku_info (商品信息表)
	sku_id(商品id), goods_name(商品名称), category_id(品类id), price(商品单价), del_flag(删除状态; 0:正常;1:删除)

表3; t_category_info (品类信息表)
	category_id(品类id), category_name(品类名称)
-- 数据准备
WITH t_order_detail AS (
SELECT * FROM (
  VALUES 
      (1002, 1101, 1203, '2023-01-01', 1100, 3)
    , (1012, 1101, 1211, '2023-01-03', 1200, 2)
    , (1016, 1102, 1205, '2023-01-02', 2000, 1)
    , (1015, 1103, 1204, '2023-01-04', 1500, 3)
    , (1018, 1103, 1206, '2023-01-05', 1700, 5)
    , (1022, 1104, 1207, '2023-01-12', 1100, 6)
    , (1025, 1105, 1202, '2023-01-25', 1200, 3)
    , (1035, 1106, 1203, '2023-01-13', 1100, 2)
    , (1023, 1107, 1204, '2023-02-02', 1500, 3)
    , (1036, 1108, 1202, '2023-02-04', 1200, 1)
    , (1041, 1109, 1211, '2023-02-03', 1200, 2)
    , (1052, 1110, 1204, '2023-02-01', 1500, 3)
    , (1058, 1111, 1206, '2023-02-05', 1700, 4)
    , (1043, 1112, 1205, '2023-02-06', 2000, 2)
    , (1066, 1113, 1203, '2023-02-11', 1100, 5)
    , (1061, 1114, 1204, '2023-02-16', 1500, 4)
) AS table_name(id, order_id, sku_id, create_date, price, quantity)
)

, t_sku_info AS (
SELECT * FROM (
  VALUES 
      (1203, '小米', 6 , 1100, 0)
    , (1211, '苹果', 6 , 1200, 0)
    , (1205, 'OPPO', 6 , 2000, 0)
    , (1204, '热水器', 3 , 1500, 0)
    , (1206, '吹风机', 3 , 1700, 0)
    , (1207, '跑步机', 7 , 1100, 0)
    , (1202, '划船机', 7 , 1200, 0)
    , (1209, '椭圆机', 7 , 1800, 1)
) AS table_name(sku_id, goods_name, category_id, price, del_flag)
)

, t_category_info AS (
SELECT * FROM (
  VALUES 
      (6 , '数码产品')
    , (3 , '家用电器')
    , (7 , '运动器材')
) AS table_name(category_id, category_name)
)
2- 代码实现
-- 1. 统计每种品类在售的商品数量 -> t1
SELECT 
      a.category_id, b.category_name
    , COUNT(DISTINCT a.sku_id) AS sku_ct
FROM t_sku_info a 
LEFT JOIN t_category_info b 
ON a.category_id = b.category_id
WHERE a.del_flag = 0
GROUP BY a.category_id, b.category_name
;
category_idcategory_namesku_ct
3家用电器2
6数码产品3
7运动器材2
SELECT -- 统计每种商品的销量
      b.category_id, a.sku_id, b.goods_name
    , SUM(quantity) AS order_sum
FROM t_order_detail a 
LEFT JOIN t_sku_info b  
ON a.sku_id = b.sku_id
WHERE b.del_flag = 0
GROUP BY a.sku_id, b.goods_name, b.category_id
;
category_idsku_idgoods_nameorder_sum
71202划船机4
61203小米10
31204热水器13
61205OPPO3
31206吹风机9
71207跑步机6
61211苹果4
-- 2. 统计每个品类中 最畅销的产品, 销量最高的产品  -> t2
SELECT 
    category_id, sku_id, goods_name, order_sum
FROM (
SELECT 
      category_id, sku_id, goods_name, order_sum
    , RANK() OVER(PARTITION BY category_id ORDER BY order_sum DESC) AS rk  -- 每种品类中, 销量降序排列
FROM (
SELECT -- 统计每种商品的销量
      b.category_id, a.sku_id, b.goods_name
    , SUM(quantity) AS order_sum
FROM t_order_detail a 
LEFT JOIN t_sku_info b  
ON a.sku_id = b.sku_id
WHERE b.del_flag = 0
GROUP BY a.sku_id, b.goods_name, b.category_id
) c
) d
WHERE rk = 1
;
category_idsku_idgoods_nameorder_sumrk
31204热水器131
31206吹风机92
61203小米101
61211苹果42
61205OPPO33
71207跑步机61
71202划船机42
category_idsku_idgoods_nameorder_sum
31204热水器13
61203小米10
71207跑步机6
-- 3. 合并t1,t2 数据
SELECT 
      a.category_id, b.category_name, b.sku_ct, a.sku_id, a.goods_name, a.order_sum
FROM t2 a
LEFT JOIN t1 b  
ON a.category_id = b.category_id
;
category_idcategory_namesku_ctsku_idgoods_nameorder_sum
3家用电器21204热水器13
6数码产品31203小米10
7运动器材21207跑步机6

end

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现统计热门品类商品top10,可以按照以下步骤进行: 1. 从数据源中读入商品数据,每个商品包含商品ID、商品名称、商品所属品类等信息。 2. 根据商品所属品类进行分组,将同一品类商品放到一起。 3. 统计每个品类下的商品数量,得到每个品类商品总数。 4. 对每个品类下的商品数量进行排序,得到每个品类商品数量排名。 5. 取出每个品类中数量排名前10的商品,即为热门品类商品top10。 Scala代码示例: ```scala // 从数据源中读入商品数据,每个商品包含商品ID、商品名称、商品所属品类等信息 val products = Seq( ("p1", "商品1", "品类1"), ("p2", "商品2", "品类2"), ("p3", "商品3", "品类1"), ("p4", "商品4", "品类2"), ("p5", "商品5", "品类1"), ("p6", "商品6", "品类3"), ("p7", "商品7", "品类2"), ("p8", "商品8", "品类1"), ("p9", "商品9", "品类2"), ("p10", "商品10", "品类3"), ("p11", "商品11", "品类1"), ("p12", "商品12", "品类2"), ("p13", "商品13", "品类3"), ("p14", "商品14", "品类1"), ("p15", "商品15", "品类2") ) // 根据商品所属品类进行分组,将同一品类商品放到一起 val productsByCategory = products.groupBy(_._3) // 统计每个品类下的商品数量,得到每个品类商品总数 val productsCountByCategory = productsByCategory.mapValues(_.size) // 对每个品类下的商品数量进行排序,得到每个品类商品数量排名 val productsCountRankByCategory = productsCountByCategory.toSeq.sortBy(-_._2).zipWithIndex // 取出每个品类中数量排名前10的商品,即为热门品类商品top10 val top10ProductsByCategory = productsByCategory.mapValues { products => products.sortBy(-productsCountRankByCategory(productsCountByCategory(products.head._3) - 1)._2).take(10) } // 打印结果 top10ProductsByCategory.foreach { case (category, products) => println(s"$category 热门商品top10:") products.foreach { case (id, name, _) => println(s"$id\t$name") } println() } ``` 输出结果: ``` 品类1 热门商品top10: p8 商品8 p1 商品1 p5 商品5 p11 商品11 p14 商品14 p3 商品3 品类2 热门商品top10: p2 商品2 p4 商品4 p7 商品7 p9 商品9 p12 商品12 p15 商品15 品类3 热门商品top10: p10 商品10 p13 商品13 p6 商品6 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值