使用 M 计算 Power Query 中的余额
Calculate balance in Power Query with M
我有两个 table:
第一个持有发送给客户的退款:
Customer ID
Refund ID
Total refunded
1
Ref1
0.00
1
Ref2
0.00
1
Ref3
0.00
2
Ref4
0.00
第二个链接上面的 table 与相关的信用票据:
Customer ID
Credit note Allocation ID
Refund Amount Allocated
Refund ID
1
CnAll1
0.00
Ref1
1
CnAll2
0.00
Ref2
1
CnAll3
.00
Ref2
1
CnAll4
0.00
Ref3
我想要实现的是第三个 table 两者的结合,每个退款都没有分配退款余额
Customer ID
Refund ID
Total refunded
Credit note Allocation ID
Refund Amount Allocated
Balance not allocated to any Credit note
1
Ref1
0.00
CnAll1
0.00
$-
1
Ref2
0.00
CnAll2
0.00
$-
1
Ref2
0.00
CnAll3
.00
$-
1
Ref3
0.00
CnAll4
0.00
0.00
2
Ref4
0.00
$-
0.00
- Refund Ref1 与相关贷记单完全匹配。信用票据的价值 = 退款。没有余额未分配
- Refund Ref2 与两张贷记单完全匹配。信用票据的价值 = 退款。没有余额未分配
- Refund Ref3只匹配$100,因为信用票据的价值是$100。未分配的余额是$200-100=$100
- Refund Ref4 根本不匹配,因此未分配的余额为 300 美元
我找不到在上述所有情况下计算正确余额的方法。
主要是做一些合并,然后将 ID 行移动一位进行比较
将您的第二个 table 作为 Table1 加载到 powerquery
使用代码将您的第一个 table 加载到 powerquery 中:
let Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Customer ID", Int64.Type}, {"Refund ID", type text}, {"Total refunded", Int64.Type}}),
#"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Customer ID", "Refund ID"}, Table1, {"Customer ID", "Allocated Refund ID"}, "Table1", JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table1", {"Credit note Allocation ID", "Refund Amount"}, {"Credit note Allocation ID", "Refund Amount"}),
RefundByID=Table.Group(Table1, {"Allocated Refund ID"}, {{"Refund Amount", each List.Sum([Refund Amount]), type nullable number}}),
#"Merged Queries2" = Table.NestedJoin(#"Expanded Table1", {"Refund ID"},RefundByID, {"Allocated Refund ID"}, "Table1", JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries2", "Table1", {"Refund Amount"}, {"Refund Amount.1"}),
#"Replaced Value" = Table.ReplaceValue(#"Expanded Table2",null,0,Replacer.ReplaceValue,{"Refund Amount.1"}),
//shift Refund ID down one row
shiftedList = List.RemoveFirstN(#"Replaced Value"[Refund ID],1) & {null},
custom1 = Table.ToColumns(#"Replaced Value") & {shiftedList},
custom2 = Table.FromColumns(custom1,Table.ColumnNames(#"Replaced Value") & {"Next Row"}),
#"Added Custom" = Table.AddColumn(custom2, "Balance", each if [Refund ID]=[Next Row] then 0 else [Total refunded]-[Refund Amount.1]),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Refund Amount.1", "Next Row"})
in #"Removed Columns"
我有两个 table:
第一个持有发送给客户的退款:
Customer ID | Refund ID | Total refunded |
---|---|---|
1 | Ref1 | 0.00 |
1 | Ref2 | 0.00 |
1 | Ref3 | 0.00 |
2 | Ref4 | 0.00 |
第二个链接上面的 table 与相关的信用票据:
Customer ID | Credit note Allocation ID | Refund Amount Allocated | Refund ID |
---|---|---|---|
1 | CnAll1 | 0.00 | Ref1 |
1 | CnAll2 | 0.00 | Ref2 |
1 | CnAll3 | .00 | Ref2 |
1 | CnAll4 | 0.00 | Ref3 |
我想要实现的是第三个 table 两者的结合,每个退款都没有分配退款余额
Customer ID | Refund ID | Total refunded | Credit note Allocation ID | Refund Amount Allocated | Balance not allocated to any Credit note |
---|---|---|---|---|---|
1 | Ref1 | 0.00 | CnAll1 | 0.00 | $- |
1 | Ref2 | 0.00 | CnAll2 | 0.00 | $- |
1 | Ref2 | 0.00 | CnAll3 | .00 | $- |
1 | Ref3 | 0.00 | CnAll4 | 0.00 | 0.00 |
2 | Ref4 | 0.00 | $- | 0.00 |
- Refund Ref1 与相关贷记单完全匹配。信用票据的价值 = 退款。没有余额未分配
- Refund Ref2 与两张贷记单完全匹配。信用票据的价值 = 退款。没有余额未分配
- Refund Ref3只匹配$100,因为信用票据的价值是$100。未分配的余额是$200-100=$100
- Refund Ref4 根本不匹配,因此未分配的余额为 300 美元
我找不到在上述所有情况下计算正确余额的方法。
主要是做一些合并,然后将 ID 行移动一位进行比较
将您的第二个 table 作为 Table1 加载到 powerquery
使用代码将您的第一个 table 加载到 powerquery 中:
let Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Customer ID", Int64.Type}, {"Refund ID", type text}, {"Total refunded", Int64.Type}}),
#"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Customer ID", "Refund ID"}, Table1, {"Customer ID", "Allocated Refund ID"}, "Table1", JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table1", {"Credit note Allocation ID", "Refund Amount"}, {"Credit note Allocation ID", "Refund Amount"}),
RefundByID=Table.Group(Table1, {"Allocated Refund ID"}, {{"Refund Amount", each List.Sum([Refund Amount]), type nullable number}}),
#"Merged Queries2" = Table.NestedJoin(#"Expanded Table1", {"Refund ID"},RefundByID, {"Allocated Refund ID"}, "Table1", JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries2", "Table1", {"Refund Amount"}, {"Refund Amount.1"}),
#"Replaced Value" = Table.ReplaceValue(#"Expanded Table2",null,0,Replacer.ReplaceValue,{"Refund Amount.1"}),
//shift Refund ID down one row
shiftedList = List.RemoveFirstN(#"Replaced Value"[Refund ID],1) & {null},
custom1 = Table.ToColumns(#"Replaced Value") & {shiftedList},
custom2 = Table.FromColumns(custom1,Table.ColumnNames(#"Replaced Value") & {"Next Row"}),
#"Added Custom" = Table.AddColumn(custom2, "Balance", each if [Refund ID]=[Next Row] then 0 else [Total refunded]-[Refund Amount.1]),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Refund Amount.1", "Next Row"})
in #"Removed Columns"