如何将表中两列合并为record类型新列以实现后续逆透视操作
问题原因
你的代码报错是因为Record.SelectFields的作用是从现有行记录中提取已存在的字段,无法直接生成自定义结构的新record,同时你没有正确定义Score、Comments、ReportKey三个自定义字段。
单字段构造实现代码
如果要单独生成S1Q1Record列,正确写法如下:
let Source = Base5s, step1 = Table.FirstN(Source,3), step2 = Table.AddColumn(step1, "S1Q1Record", each [ Score = [S1Q1], Comments = [S1Q1Comments], ReportKey = "S1Q1" ]) in step2
Power Query中直接用[字段名=值, 字段名=值]的语法就可以构造自定义record。
批量生成所有SxQxRecord列(推荐)
不需要手动逐个写25个AddColumn步骤,用以下代码可以自动遍历生成所有S1Q1到S5Q5对应的record列:
let Source = Base5s, // 生成所有题目编号列表 S1Q1 到 S5Q5 QuestionList = List.TransformMany({1..5}, (s)=> List.Transform({1..5}, (q)=> "S"&Text.From(s)&"Q"&Text.From(q))), // 批量添加所有Record列 AddAllRecordColumns = List.Accumulate(QuestionList, Source, (state, currentQ)=> Table.AddColumn(state, currentQ&"Record", each [ Score = Record.Field(_, currentQ), Comments = Record.Field(_, currentQ&"Comments"), ReportKey = currentQ ]) ), // 可选:删除原来的题目得分、评论列,只保留Id和新生成的Record列,方便后续逆透视 KeepNeededColumns = Table.SelectColumns(AddAllRecordColumns, {"Id"} & List.Transform(QuestionList, (q)=> q&"Record")) in KeepNeededColumns
后续逆透视得到目标表
生成所有Record列后,执行以下操作即可得到仅含Id、ReportKey、Score、Comments的结构化表:
- 选中
Id列,右键选择「逆透视其他列」 - 点击生成的
值列右上角的展开按钮,选择展开Score、Comments、ReportKey三个字段 - 删除不需要的
属性列即可
内容的提问来源于stack exchange,提问作者RussGove
相关产品推荐
相关产品推荐

