-
背景介绍
在提交商品的种类的时候,一般会有三个种类 大中小 是下钻类型,
正常情况:每个商品都会提交到小类当中
非正常情况:每个商品插入的时候,大类,中类,小类都有 情况很复杂
需求查出每个商品的所属小类,中类,大类
商品分类理论和实际差距考量--sql技术实现.png image.png商品明细宽表主要有一下组成
- 核心表是dim_goods 记录了商品的信息 id store_class_id(商品分类id)
- 商品分类表 dim_goods_class 主要字段 (id name level pid)
-品牌表 dim_brand 记录了商品的品牌名称
构建商品明细表时候,我们需要的是3类结果:商品小类、商品中类、商品大类。
因此在编写join的时候,我们需要关联3次,实际中的join情况因为分为下面3种:
==如果level=3,才会关联到level=2 ,再去关联level=1==
==如果level=2,关联到level=1,结束==
==如果level=1,结束==
结束指的是,已经到大类级别了,没有parent_id了。就是执行join,结果也是为空。
这样导致的结果是:查询出来的3级分类会形成==错位==。如:
一个商品level=2,只能查询出来中类、大类,但是根据上述join的方式,却把
中类当成了小类,大类当成了中类,把null当成了大类。
那么==在查询结果取值返回的时候,一定要进行条件判断了,使用case when语句==。避免错误。
核心代码
--商品小类 如果class1.level=3,说明这个商品第一级就是小类
CASE class1.level WHEN 3
THEN class1.id
ELSE NULL
END as min_class_id,
CASE class1.level WHEN 3
THEN class1.name
ELSE NULL
END as min_class_name,
--商品中类 如果class1.level=2,说明这个商品第一级就是中类
CASE WHEN class1.level=2
THEN class1.id
WHEN class2.level=2
THEN class2.id
ELSE NULL
END as mid_class_id,
CASE WHEN class1.level=2
THEN class1.name
WHEN class2.level=2
THEN class2.name
ELSE NULL
END as mid_class_name,
--商品大类 如果class1.level=1,说明这个商品第一级就是大类
CASE WHEN class1.level=1
THEN class1.id
WHEN class2.level=1
THEN class2.id
WHEN class3.level=1
THEN class3.id
ELSE NULL
END as max_class_id,
CASE WHEN class1.level=1
THEN class1.name
WHEN class2.level=1
THEN class2.name
WHEN class3.level=1
THEN class3.name
ELSE NULL
END as max_class_name,
网友评论