Forum Discussion

joshua1990's avatar
joshua1990
Icon for Post Prodigy rankPost Prodigy
4 years ago
Solved

TRUE FALSE if group contains value

Hi experts!

I would like to get a TRUE/FALSE if a group contains a specific value.

The structure is like this:

Order NrValueTRUE / FALSE
100ATRUE
100BTRUE
102AFALSE
102CFALSE

 

As you can see there a multiple records for each order.

I would like to get a TRUE/ FALSE if a group contains in column "Value" a 'B'.

 

How is this possible?

  • Group by Order; then aggregate by the testing if the Value in each group contains "B":

     

    let
    
    //change next line to reflect your actual source of data
        Source = Excel.CurrentWorkbook(){[Name="Table5"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Order Nr", Int64.Type}, {"Value", type text}}),
    
    
        #"Grouped Rows" = Table.Group(#"Changed Type", {"Order Nr"}, {
            {"Grouped", each _, type table [Value=nullable text]},
            {"TRUE/FALSE", each List.Contains([Value],"B"), type logical}
            }),
        
        #"Expanded Grouped" = Table.ExpandTableColumn(#"Grouped Rows", "Grouped", {"Value"}, {"Value"})
    in
        #"Expanded Grouped"

     

     

     

8 Replies

  • Group by Order; then aggregate by the testing if the Value in each group contains "B":

     

    let
    
    //change next line to reflect your actual source of data
        Source = Excel.CurrentWorkbook(){[Name="Table5"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Order Nr", Int64.Type}, {"Value", type text}}),
    
    
        #"Grouped Rows" = Table.Group(#"Changed Type", {"Order Nr"}, {
            {"Grouped", each _, type table [Value=nullable text]},
            {"TRUE/FALSE", each List.Contains([Value],"B"), type logical}
            }),
        
        #"Expanded Grouped" = Table.ExpandTableColumn(#"Grouped Rows", "Grouped", {"Value"}, {"Value"})
    in
        #"Expanded Grouped"

     

     

     

    • joshua1990's avatar
      joshua1990
      Icon for Post Prodigy rankPost Prodigy

      ronrsnfld : Thanks a lot! It works perfectly well. What if the original table has 3 columns? How would you adjust the query to get the 3 columns after expand again?

      • ronrsnfld's avatar
        ronrsnfld
        Icon for Super User rankSuper User

        There are several ways.

        You could modify the "Grouped" and "Expanded Grouped" lines:

         

         

         #"Grouped Rows" = Table.Group(#"Changed Type", {"Order Nr"}, {
                {"Grouped", each _, type table [Value=nullable text, 3rd Column=nullable text]},
                {"TRUE/FALSE", each List.Contains([Value],"B"), type logical}
                }),
            
            #"Expanded Grouped" = Table.ExpandTableColumn(#"Grouped Rows", "Grouped", {"Value","3rd Column"}, {"Value","3rd Column"})

         

         

         

    • jdelmonico's avatar
      jdelmonico
      Frequent Visitor

      Is there any way to do this with a measure? The way my company has things set up I am not able to add columns or access the query itself. I have tried messing with groupby and summarize but I am stumped. Thank you!

      • jdelmonico's avatar
        jdelmonico
        Frequent Visitor

        More accurately, I am trying to create a measure that sums up all of the Orders that contain Value "B" across several lines. I suppose I should start a new thread.

  • Vijay_A_Verma's avatar
    Vijay_A_Verma
    Icon for Most Valuable Professional rankMost Valuable Professional

    Below is an alternative solution. Put following in a custom column (Replace #"Changed Type" with your previous step)

    = List.Contains(List.Zip({#"Changed Type"[Order Nr],#"Changed Type"[Value]}),{[Order Nr],"B"})

    Marginal performance to the tune of 10-20% can be gained by buffering the lists if you have got thousands of records. These 2 lists are - #"Changed Type"[Order Nr] and #"Changed Type"[Value].

  • Another method is a self-merge and then check if each of the merged subtables has "B" in the values column.

     

    Here's a sample M query you can paste into the Advanced Editor of a new Blank Query:

     

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQwUNJRclSK1YGxnaBsIyRxENtZKTYWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Order Nr" = _t, Value = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Order Nr", Int64.Type}, {"Value", type text}}),
        #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Order Nr"}, #"Changed Type", {"Order Nr"}, "TRUE / FALSE", JoinKind.LeftOuter),
        #"Check for B" = Table.TransformColumns(#"Merged Queries",{{"TRUE / FALSE", each List.Contains([Value], "B"), type logical}})
    in
        #"Check for B"