嵌套表格中获取最大值并调整百分比总和至1的Power Query问题
嵌套表格百分比总和修正方案(M代码修复)
问题分析
你之前的代码错误地将调整后的最大值应用到所有行,而非仅修改原百分比最大的那一行。核心问题是未判断当前行是否为最大值行,直接把调整后的值批量赋值给了所有行。
正确M代码实现
以下代码针对每个嵌套子表格单独处理,仅修改百分比最大的行,其余行保留原数值:
Table.TransformColumns( 替换为你的主表名称, { "Table", // 替换为嵌套表格所在列的列名 (subTable) => let // 计算当前子表格的百分比总和 totalPct = List.Sum(subTable[Percentage]), // 获取当前子表格的最大百分比值 maxPct = List.Max(subTable[Percentage]), // 添加调整后的新百分比列 adjustedTable = Table.AddColumn( subTable, "New Percentage", each if [Percentage] = maxPct then // 仅对最大值行进行调整 if totalPct < 1 then [Percentage] + 0.01 else if totalPct > 1 then [Percentage] - 0.01 else [Percentage] else [Percentage] // 非最大值行保留原百分比 ) in adjustedTable } )
代码说明
- 遍历嵌套表格:用
Table.TransformColumns处理主表中每个嵌套的子表格,确保每个站点的数据独立计算。 - 单独计算总和与最大值:每个子表格单独计算百分比总和
totalPct和最大百分比maxPct,避免跨站点干扰。 - 精准调整目标行:在添加新列时,仅对原百分比等于
maxPct的行进行±0.01调整,其余行直接沿用原数值。
特殊情况处理(可选)
如果子表格存在多行百分比同为最大值的情况,上述代码会同时调整所有最大值行。若只需调整其中第一行最大值,可使用以下代码:
Table.TransformColumns( 替换为你的主表名称, { "Table", // 替换为嵌套表格所在列的列名 (subTable) => let totalPct = List.Sum(subTable[Percentage]), maxPct = List.Max(subTable[Percentage]), // 找到第一行最大值的索引 maxRowIndex = Table.PositionOf(subTable, Table.SelectRows(subTable, each [Percentage] = maxPct){0}), // 转换为记录列表后逐行处理 adjustedRecords = List.Transform( Table.ToRecords(subTable), (record, index) => let newPct = if index = maxRowIndex then if totalPct < 1 then record[Percentage] + 0.01 else if totalPct > 1 then record[Percentage] - 0.01 else record[Percentage] else record[Percentage] in Record.AddField(record, "New Percentage", newPct) ), adjustedTable = Table.FromRecords(adjustedRecords) in adjustedTable } )
内容的提问来源于stack exchange,提问作者DullesTower
相关产品推荐
相关产品推荐

