Forum Discussion
Power Query SUMIFS with Multiple Conditions
- 1 year ago
- You will need to list only the columns that are needed to create a unique grouping, so probably NO.
- For table type argument, you should list all of the columns that are in the "Grouped Table"
- In that case, I would use a different approach.
- I don't know how you will access [Original Balance].
- In the code below, I arbitrarily set it to 2x the value of the first [Ending Balance] so the results would be the same.
- You will need to modify depending on how you have your "Period 1 Starting Balance"
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], #"Changed Type" = Table.TransformColumnTypes(Source,{ {"UID", type text}, {"Cost Code", type text}, {"Period", Int64.Type}, {"Ending Balance", Int64.Type}}), //Index column to be able to restore processed results to original order #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1, Int64.Type), //Group by UID and Cost Code // then compute the SUMIFS using a shifted column // ASSUMES data sorted in Period order #"Grouped Rows" = Table.Group(#"Added Index", {"UID", "Cost Code"}, { {"Desired Result", (t)=> let #"Original Balance" = t{0}[Ending Balance] * 2, #"Add Index2" = Table.AddIndexColumn(t,"Index2",0,1,Int64.Type), #"Add Results" = Table.AddColumn(#"Add Index2", "Desired Results", each if [Index2]=0 then #"Original Balance"-[Ending Balance] else [Ending Balance] - #"Add Index2"{[Index2]-1}[Ending Balance], type number) in #"Add Results", type table[UID=text, Cost Code=text, Period=Int64.Type, Ending Balance=number, Index=Int64.Type, Index2=Int64.Type, Desired Results = number]}}), #"Expanded Desired Result" = Table.ExpandTableColumn(#"Grouped Rows", "Desired Result", {"Period", "Ending Balance", "Index", "Desired Results"}, {"Period", "Ending Balance", "Index", "Desired Results"}), #"Sorted Rows" = Table.Sort(#"Expanded Desired Result",{{"Index", Order.Ascending}}), #"Removed Columns" = Table.RemoveColumns(#"Sorted Rows",{"Index"}) in #"Removed Columns"
ronrsnfld Thank you!
I've accepted your solution. Just modified a little on your original post and in it, I just created 12 columns to see the change for 12 periods. With it, when it's period 1, just take the #result and less [Original Amount].
Thank you!
If I may ask, what's the double question mark (??) formula doing in this line of code?
#"Result" = Table.AddColumn(#"Shifted Balance","Desired Result", each [Ending Balance] - [Shifted Balance]??[Ending Balance])
That's in the original code.
When the Shifted column is created, the first entry is null. So [Ending Balance]-[Shifted Balance] => null.
The coalesce operator replaces the null with the result which, initially, you wanted to be the [Ending Balance]
In the original code, you could replace the second argument of the coalesce operator resulting in
each [Ending Balance] - [Shifted Balance]??#"Original Balance"-[Ending Balance])
and that would also work.
The Index column method is just another way of doing things. You can try both and see which runs better on your actual data.