Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
4 years ago
Solved

Create a Table with All Possible Combos from a Single Column and Data for Each Combo

Hi everyone,

 

Posting here for the first time. This forum has helped a lot over the past few months of learning Power BI. I could use some help with something that I haven't seen in my googling.


Updated (7/25/22) the tables for clarification:

Let's say I have a data table that looks like this:

SuperGroupGroupValue
A1

5

A15
A27
A27
A32
A31
A44
A46
B53
B53
C63
C62
C79
C78

 

My goal is to be able to tell which combination of groups would provide the lowest %CV within each SuperGroup. So ultimately, I'd like a table (table visual) that looks like this:

SuperGroupComboAverageCV
A150%
A270%
A31.547%
A4528%
A1,2619%
A2,34.2575%
A3,43.2568%
A1,33.2563%
A1,4516%
A2,4624%
A1,2,34.556%
A1,2,45.6721%
A2,3,44.558%
A1,3,43.8351%
A1,2,3,44.62548%
B530%
C62.528%
C78.58%
C6,75.564%

Another thing to note is that I will only ever be looking at 1-4 groups at a time, so the number of combos won't be endless, but the Groups will change over time (e.g. could be looking at combos with Groups 1201, 1202, 1203, 1204).

 

Is this possible?

 

Thanks in advance!

13 Replies

  • You can, but they come at a cost. You may run into Formula Firewall issues if not careful.  Note that you can also inline them into your main query, that should keep everything inside the same partition.

  • Interesting problem. Aren't you missing the four "groups of one"  ?

     

    The Group average for 1,2 is 5.75, not 6.  Please correct your sample data.

     

    Please explain what %CV means and how it is calculated.

    • lbendlin's avatar
      lbendlin
      Super User

      Here is the first step - create all possible combinations:

       

      Table:

      let
          Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUTJVitWBsEzALCMgyxyNZQxkGcFZhmCWCVwHiGWmFBsLAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Group = _t, Value = _t]),
          #"Changed Type" = Table.TransformColumnTypes(Source,{{"Group", type text}, {"Value", Int64.Type}})
      in
          #"Changed Type"

      Combo:

      let
          Source = Table[Group],
          #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
          #"Removed Duplicates" = Table.Distinct(#"Converted to Table"),
          #"Added Custom" = Table.AddColumn(#"Removed Duplicates", "Custom", each #"Removed Duplicates"),
          #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Column1"}, {"Column2"}),
          #"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Custom", each #"Removed Duplicates"),
          #"Expanded Custom1" = Table.ExpandTableColumn(#"Added Custom1", "Custom", {"Column1"}, {"Column3"}),
          #"Added Custom2" = Table.AddColumn(#"Expanded Custom1", "Custom", each #"Removed Duplicates"),
          #"Expanded Custom2" = Table.ExpandTableColumn(#"Added Custom2", "Custom", {"Column1"}, {"Column4"}),
          #"Added Custom3" = Table.AddColumn(#"Expanded Custom2", "Custom", each List.Sort(List.Distinct({[Column1],[Column2],[Column3],[Column4]}))),
          #"Extracted Values" = Table.TransformColumns(#"Added Custom3", {"Custom", each Text.Combine(List.Transform(_, Text.From), ","), type text}),
          #"Removed Duplicates1" = Table.Distinct(#"Extracted Values", {"Custom"})
      in
          #"Removed Duplicates1"

       

       

      • lbendlin's avatar
        lbendlin
        Super User

        And here is the second part - calculating the averages

         

         

    • Anonymous's avatar
      Anonymous
      Not applicable

      %CV is the Standard Deviation / Average. By choosing the combo with the lowest %CV, I'd be able to tell which combination would have the lowest variability. This is just an easy DAX measure though. The part I'm having trouble with is setting up the table to provide each combo and values.