如何将品牌转为列名完成行转列并筛选同组耐克最高价格行
数据处理实现方案
需求拆解
- 长表转宽表:以原始表中Brand列的所有取值为列名生成宽表,转换全程不使用聚合函数,无对应匹配值的单元格用NULL填充
- 数据筛选:对生成的宽表,按
Month、Region、Category、Size四个字段分组,筛选出组内Nike价格高于同组其他所有品牌价格的行
输入原始明细数据
| Month | Region | Category | Size | Brand | Price |
|---|---|---|---|---|---|
| January | Canada | T-shirts | S | Nike | 100 |
| January | Canada | T-shirts | S | Reebok | 150 |
| January | Canada | T-shirts | S | Puma | 200 |
| January | Canada | Jacket | S | Nike | 200 |
| January | Canada | Jacket | S | Reebok | 300 |
| January | USA | Jacket | L | Puma | 400 |
| January | USA | Jacket | L | Reebok | 500 |
无聚合行转列实现步骤
由于每个(Month、Region、Category、Size)维度组合下,每个品牌仅对应一条价格记录,不存在重复值,因此全程不需要使用SUM、MAX等聚合函数,直接通过等值关联完成列转换:
- 先提取所有维度字段的唯一组合,作为宽表的基础行集合,避免产生重复行
- 逐次关联原始明细表,每次仅匹配单一品牌的价格数据作为新列值:
- 关联原始表中Brand='Nike'的记录,取对应Price作为Nike列的值
- 关联原始表中Brand='Reebok'的记录,取对应Price作为Reebok列的值
- 关联原始表中Brand='Puma'的记录,取对应Price作为Puma列的值
- 关联过程中无匹配的单元格自动填充为NULL,最终生成的宽表结构如下:
| Month | Region | Category | Size | Nike | Reebok | Puma |
|---|---|---|---|---|---|---|
| January | Canada | T-shirts | S | 100 | 150 | 200 |
| January | Canada | Jacket | S | 400 | 300 | NULL |
| January | USA | Jacket | L | NULL | 500 | 400 |
筛选逻辑实现
按照要求逐行判断筛选条件:
筛选规则:同一维度组内,只要Nike的价格数值大于其他所有非NULL的品牌价格数值,就保留该行;如果Nike本身为NULL则直接排除,其他品牌的NULL值不参与比较
逐行校验结果:
- 第一行(Canada/T-shirts/S):Nike价格100,低于同组Reebok150、Puma200,不满足条件,排除
- 第二行(Canada/Jacket/S):Nike价格400,高于同组Reebok300,Puma为NULL不参与比较,满足条件,保留
- 第三行(USA/Jacket/L):Nike价格为NULL,直接排除
最终筛选输出结果:
| Month | Region | Category | Size | Nike | Reebok | Puma |
|---|---|---|---|---|---|---|
| January | Canada | Jacket | S | 400 | 300 | NULL |
内容的提问来源于stack exchange,提问作者outgush
相关产品推荐
相关产品推荐

