Power BI数据透视与逆透视:宽表转长表操作异常排查
宽表转对应长表的正确实现方案(Power BI/Power Query环境)
现有数据与目标说明
源表结构:
- 主键列:
recordid(唯一值标识单条主记录) - 三类重复填报字段,存在版本后缀变体(如
is_this_study_feasible_v2为该字段的第2轮填报列):email系列列is_this_study_feasible系列列please_advise系列列
转换目标:输出长表,可按recordid维度,准确关联每一轮填报对应的填报人邮箱、可行性判断、建议内容。
此前操作的错误根因
- 两次逆透视后直接无聚合透视报错:逆透视后未提取列名自带的版本标识,导致同个
recordid下同个字段存在多条值,触发重复键冲突 - 手动加索引后透视内容错位:索引是按逆透视后的行顺序生成,一旦空值填充、列顺序调整导致逆透视后行排序变化,索引和实际填报轮次的匹配关系就会完全错乱,同轮次的三个字段无法对齐
- 原有代码填充空值后失效:旧逻辑依赖行位置做关联,未基于列名本身的版本规则做匹配,空值填充后行排序变动直接导致关联错位。
可复现的稳定实现步骤
所有步骤不依赖行顺序,空值填充、列顺序调整都不会影响结果准确性:
- 进入Power Query编辑器,选中
recordid列,右键选择逆透视其他列,得到包含recordid、Attribute(原列名)、Value(单元格值)三列的临时表 - 新增自定义列提取基础字段名,公式如下:
= Table.AddColumn(逆透视后表, "基础字段", each Text.BeforeDelimiter([Attribute], "_v", Occurrence.First), type text) - 新增自定义列提取填报轮次序号,无
_v后缀的列默认归为第1轮填报,公式如下:= Table.AddColumn(上一步输出表, "填报轮次", each if Text.Contains([Attribute], "_v") then Number.FromText(Text.AfterDelimiter([Attribute], "_v", Occurrence.First)) else 1, Int64.Type) - 删除原
Attribute列,此时表结构为recordid、Value、基础字段、填报轮次 - 选中
基础字段列,选择透视列,值列选择Value,聚合函数选择「不要聚合」 - (可选整理步骤)选中
recordid、填报轮次两列,向上填充同组内的空值,即可得到每一行对应recordid下某一轮次完整的填报人、可行性判断、建议内容。
该逻辑的唯一匹配依据是原列名自带的版本标识,和单元格内容、行排序完全无关,填充空白单元格、调整列顺序都不会导致匹配错位,也不会触发重复行报错。
内容的提问来源于stack exchange,提问作者Joe Crozier
相关产品推荐
相关产品推荐

