Forum Discussion

XavJSY's avatar
XavJSY
New Member
10 years ago
Solved

Create a dynamic combo list based on 3 other lists

Hi   I need to create a dynamic list feeding from 3 different lists: Say I have the 3 following lists X,Y and Z currently containing the following values:   X: a b c Y: A B C Z: 1 2 3 ...
  • jclark88's avatar
    10 years ago

    In SQL i'd normally use a cross join to create the cartesian product of all values - basically, joining every row with every other row. I'm not sure this is possible in power query, but you can trick it by creating a custom column for all input tables that has the same value, then doing some joins on these columns (all the values are the same so every row will join with every other row)..

     

    I've knocked together the power query here (might be a more effecient way but this seems to work):

     

     

    let
    
        //Our source tables, replace with whatever, just make sure the Colum header is "Val"
        X = Table.FromList({"a","b","c"}, null, {"Val"}),
        Y = Table.FromList({"A","B","C"}, null, {"Val"}),
        Z = Table.FromList({"1","2","3"}, null, {"Val"}),
        
    
        //Adding custom column for join
        X_2 = Table.AddColumn(X, "JoinCol", each 1),
        Y_2 = Table.AddColumn(Y, "JoinCol", each 1),
        Z_2 = Table.AddColumn(Z, "JoinCol", each 1),
    
        //Join all the tables together
        Join_1 = Table.NestedJoin(X_2,"JoinCol",Y_2,"JoinCol","Y"),
        Join_2 = Table.NestedJoin(Join_1,"JoinCol",Z_2,"JoinCol","Z"),
    
        //Remove the custom column
        RemoveCol = Table.RemoveColumns(Join_2,{"JoinCol"}),
        
        //Expand out our Y and Z columns
        ExpandY = Table.ExpandTableColumn(RemoveCol, "Y", {"Val"}, {"Y.Val"}),
        ExpandZ = Table.ExpandTableColumn(ExpandY, "Z", {"Val"}, {"Z.Val"}),
    
        //Rename the columns to something we expect
        RenameColumns = Table.RenameColumns(ExpandZ,{{"Val", "X"}, {"Y.Val", "Y"}, {"Z.Val", "Z"}})
    
    in
        RenameColumns

    This outputs a table like this: 

     

    X,Y,Z

    aA1
    aA2
    aA3
    aB1
    aB2
    aB3
    aC1
    aC2
    aC3
    bA1
    bA2
    bA3
    bB1
    bB2
    bB3
    bC1
    bC2
    bC3
    cA1
    cA2
    cA3
    cB1
    cB2
    cB3
    cC1
    cC2
    cC3