如何将品牌为列的客户排名表转换为排名为列、品牌为值的格式?
表格转换解决方案
针对你遇到的unpivot/pivot后得到计数而非品牌名的问题,核心是要确保透视时聚合的是品牌名称字段,而非默认的数值计数。以下分两种常用场景给出具体操作:
一、SQL实现(以SQL Server为例)
假设原始表名为BrandRank,结构与你提供的一致:
1. 先执行Unpivot(宽表转窄表)
将各品牌列转换为品牌名+排名的行记录,过滤空值:
SELECT CustID, BrandName, RankValue FROM BrandRank UNPIVOT ( RankValue FOR BrandName IN (Brand1, Brand2, Brand3, Brand4, Brand5, Brand6, Brand10) ) AS Unpivoted WHERE RankValue IS NOT NULL
2. 再执行Pivot(窄表转宽表)
这里要指定聚合品牌名称(用MAX/MIN均可,因为每个CustID+RankValue组合对应唯一品牌):
SELECT CustID, [1], [2], [3], [4], [5] FROM ( -- 嵌套上面的Unpivot结果 SELECT CustID, BrandName, RankValue FROM BrandRank UNPIVOT ( RankValue FOR BrandName IN (Brand1, Brand2, Brand3, Brand4, Brand5, Brand6, Brand10) ) AS Unpivoted WHERE RankValue IS NOT NULL ) AS RankData PIVOT ( MAX(BrandName) FOR RankValue IN ([1], [2], [3], [4], [5]) ) AS Pivoted;
二、Excel Power Query实现
- 选中原始表格,点击「数据」选项卡→「从表格/区域」进入Power Query编辑器
- 选中
CustID列,点击「转换」选项卡→「逆透视列」→「逆透视其他列」,得到三列:CustID、属性(品牌名)、值(排名) - 过滤
值列的空值:点击值列筛选器,取消勾选「空」 - 点击「转换」选项卡→「透视列」,设置参数:
- 值列:选择「属性」(即品牌名)
- 列名:选择「值」(即排名)
- 高级选项:聚合值函数选择「不要聚合」(因每个客户+排名对应唯一品牌)
- 点击「关闭并上载」,即可得到目标表格
问题原因说明
你之前得到计数结果,是因为透视时默认对数值列执行了COUNT聚合,而非针对品牌名称字段进行取值。只要明确聚合的是品牌名称,就能得到正确的转换结果。
内容的提问来源于stack exchange,提问作者B T
相关产品推荐
相关产品推荐

