Power Query中重构人员规划表格:按指定人员筛选X/Y值并生成对应日期汇总表
Power Query中重构人员规划表格:按指定人员筛选X/Y值并生成对应日期汇总表
嗨,我来帮你一步步搞定这个Power Query的表格重构需求!你要的是根据选中的人员,筛选出他们标记为X/Y的记录,再按字母分组汇总对应的日期对吧?咱们一步步来:
一、先理清楚咱们的数据源
你已经有两个关键数据源了:
- 主数据表:包含日期(Date)和PersonA/B/C三列的原始表
- 人员选择表:带下拉选项的单列表,用来选择要查看的目标人员
二、具体操作步骤(附M代码)
直接给你写好可复用的M代码,每一步我都加上注释,你照着改对应表名就行:
let // 1. 加载你的两个数据源(把引号里的表名改成你实际的表名) 主表 = Excel.CurrentWorkbook(){[Name="你的主数据表名称"]}[Content], 人员选择表 = Excel.CurrentWorkbook(){[Name="你的人员选择表名称"]}[Content], // 2. 获取当前选中的人员(动态获取下拉框的选择值) varSelectedPerson = Table.FirstValue(人员选择表[你的人员列列名]), // 3. 只保留主表中的日期列和选中的人员列,删掉其他无关列 保留目标列 = Table.SelectColumns(主表, {"Date", varSelectedPerson}), // 4. 筛选出该人员列值为X或Y的行(忽略其他值) 筛选有效行 = Table.SelectRows(保留目标列, each Record.Field(_, varSelectedPerson) = "X" or Record.Field(_, varSelectedPerson) = "Y"), // 5. 把选中的人员列重命名为"Letter",方便后续分组 重命名列 = Table.RenameColumns(筛选有效行, {{varSelectedPerson, "Letter"}}), // 6. 添加"Person"列,值就是咱们选中的人员 添加人员列 = Table.AddColumn(重命名列, "Person", each varSelectedPerson), // 7. 按Person和Letter分组,把对应的日期收集成一个列表 分组汇总日期 = Table.Group(添加人员列, {"Person", "Letter"}, {{"日期列表", each List.RemoveNulls([Date]), type list}}), // 8. 把日期列表转换成动态的日期列(比如Date1、Date2...自动生成对应数量的列) 转换为多列 = Table.AddColumn(分组汇总日期, "日期列记录", each Record.FromList([日期列表], List.Transform({1..List.Count([日期列表])}, each "Date" & Text.From(_)))), // 9. 展开刚才生成的日期列记录,得到横向排列的日期 展开日期列 = Table.ExpandRecordColumn(转换为多列, "日期列记录", List.Distinct(List.Combine(Table.Column(转换为多列, "日期列记录") |> List.Transform(Record.FieldNames)))), // 10. 删掉临时的"日期列表"列,调整列顺序把Person和Letter放最前面 移除临时列 = Table.RemoveColumns(展开日期列, {"日期列表"}), 调整列顺序 = Table.ReorderColumns(移除临时列, List.Combine({{"Person", "Letter"}, List.RemoveItems(Table.ColumnNames(移除临时列), {"Person", "Letter"})})) in 调整列顺序
三、关键步骤解释
- 动态引用选中人员:用
Record.Field(_, varSelectedPerson)来获取对应列的值,这样不管选PersonA/B/C都能自动适配,不用硬写列名 - 分组收集日期:通过
Table.Group把同一个人员+字母组合的日期都攒成列表,避免重复行 - 动态生成日期列:把日期列表转成记录再展开,这样不管有多少个日期,都会自动生成Date1、Date2...的列,不用手动加列
你把代码里的表名、列名改成你实际的名称,导入Power Query运行就能得到你想要的结果啦!
备注:内容来源于stack exchange,提问作者Brtrnd
相关产品推荐
相关产品推荐

