其实,问题中描述的条件在一定程度上把问题给复杂化了,经沟通确认,该问题的需求只是将明细数据从小往大用于凑成合计数的过程,当某一个明细数参与累计达到或超过合计数后,仅取其中满足合计数的差额。在Excel中解法如下:
用同样的思路在Power Query中实现也比较简单,关键步骤如下:
1、两表合并查询并排序后,分组添加各Id的索引(按后面算法也可不分组直接添加索引)
2、添加自定义列计算各Id累计到当前行的和
3、添加自定义列计算得到结果
其实,问题中描述的条件在一定程度上把问题给复杂化了,经沟通确认,该问题的需求只是将明细数据从小往大用于凑成合计数的过程,当某一个明细数参与累计达到或超过合计数后,仅取其中满足合计数的差额。在Excel中解法如下:
用同样的思路在Power Query中实现也比较简单,关键步骤如下:
1、两表合并查询并排序后,分组添加各Id的索引(按后面算法也可不分组直接添加索引)
2、添加自定义列计算各Id累计到当前行的和
3、添加自定义列计算得到结果
我发现在求累计和的时候,一旦一个Id中一旦有重复值,累计和就不对了
谢谢大海老师引导,已解决
this is code
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
更改的类型 = Table.TransformColumnTypes(源,{{"Id", type text}, {"明细", Int64.Type}}),
合并的查询1 = Table.NestedJoin(更改的类型,{"Id"},表2,{"Id"},"表2",JoinKind.LeftOuter),
a = Table.ExpandTableColumn(合并的查询1, "表2", {"合计"}, {"合计"}),
排序的行 = Table.Sort(a,{{"Id", Order.Ascending}, {"明细", Order.Ascending}}),
已添加自定义1 = Table.Group(排序的行, "Id", {{"计数",each Table.AddIndexColumn(_,"Index",1),type table}}),
"展开的“计数”" = Table.ExpandTableColumn(已添加自定义1, "计数", List.RemoveItems(Table.ColumnNames(已添加自定义1{0}[计数]),{"Id"})),
已添加自定义 = Table.AddColumn(#"展开的“计数”", "累计明细", each List.Sum(Table.SelectRows(#"展开的“计数”",(x)=> x[Index]<=[Index] and x[Id]=[Id])[明细])),
已添加条件列 = Table.AddColumn(已添加自定义, "结果", each if [累计明细] <= [合计] then [明细] else if [明细]-([累计明细]-[合计]) < 0 then 0 else [明细]-([累计明细]-[合计]))
in
已添加条件列
let
HJ = Excel.CurrentWorkbook(){[Name="表2"]}[Content],
MX = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
Custom1 = Table.Group(MX,"ld",{"n",each List.Accumulate(List.Sort([明细],1),{},(x,y)=>x&{List.Min({Table.SelectRows(HJ,(h)=>h[ld]=[ld]{0})[合计]{0}-List.Sum(x),y})})}),
"Expanded {0}" = Table.ExpandListColumn(Custom1, "n")
in
"Expanded {0}"