Forum Discussion

don_writer's avatar
don_writer
Helper II
7 years ago
Solved

Compare different values in different rows

Hi,

I am trying to compare values from one row to values in other rows to determine if all the criteria is present. Here is a sample of my table:

 

RelOTObjectIDRORelatedID
003S024O125
008S024P024
003S111O087
008S111P017
003S138O081
008S138P138
003S149O502
008S149P458
003S154O049
008S154P337
012S154O049
003S164O249
008S164P164
003S176O086
008S176P700
003S178O128
008S178P178
003S191O727
008S191P191
012S191O727
003S231O060
008S231P231
003S237O541

 

I'm looking to make certain there is always and ObjectID with and RO of "O" and one with "P". And it's generally okay if there are multiple "O"s but should only be one "P" per ObjectID.

 

How might I go about that in DAX and/or Power Query?

 

Thanks,

~Don

  • If the sample provided is Table1, you could create a 2nd table

    Table2 = SELECTCOLUMNS(FILTER(Table1, Table1[RO] = "P"), "ObjectID", Table1[ObjectID], "RO", Table1[RO])

    You could do a DISTINCTCOUNT on ObjectID in Table2 to look for ObjectID with more than 1 P

     

    Then add a calculated column to Table1

    Is Matching P = 
    VAR _PtoFind =
        LOOKUPVALUE (
            'Table2'[ObjectID], 
            'Table2'[ObjectID], Table1[ObjectID]
        )
    RETURN
     IF (Table1[RO] = "P", "Skip",
     IF (_PtoFind <> BLANK (), "Y", "N" ) )

    This should return N if there is an O record without a matching P.

    Note: The calculated column will error if there are more than 1 P records in Table2 for a specific ObjectID

  • I'll be damned, I thought the fourth parameter was a alternate result if the output was blank. Thanks for this.

     

    Here is the final code for anyone looking for this kind of thing.

    Matching P = 
        VAR varPtoFind = 
            LOOKUPVALUE( srcJRChief[ObjectID], srcJRChief[ObjectID], srcJRChief[ObjectID], srcJRChief[RO],"P")
        RETURN
            IF(srcJRChief[RO]="P","Skip",
            IF(varPtoFind<>BLANK(),"Y","N"))

8 Replies

  • HotChilli's avatar
    HotChilli
    Community Champion

    If the sample provided is Table1, you could create a 2nd table

    Table2 = SELECTCOLUMNS(FILTER(Table1, Table1[RO] = "P"), "ObjectID", Table1[ObjectID], "RO", Table1[RO])

    You could do a DISTINCTCOUNT on ObjectID in Table2 to look for ObjectID with more than 1 P

     

    Then add a calculated column to Table1

    Is Matching P = 
    VAR _PtoFind =
        LOOKUPVALUE (
            'Table2'[ObjectID], 
            'Table2'[ObjectID], Table1[ObjectID]
        )
    RETURN
     IF (Table1[RO] = "P", "Skip",
     IF (_PtoFind <> BLANK (), "Y", "N" ) )

    This should return N if there is an O record without a matching P.

    Note: The calculated column will error if there are more than 1 P records in Table2 for a specific ObjectID

    • don_writer's avatar
      don_writer
      Helper II

      This is awesome and the direction I was contemplating. Just curious if there is a way to accomplish this without an extra table?

      • HotChilli's avatar
        HotChilli
        Community Champion

        There is.  I started with the separate table to make testing easier.

         

        I won't do it for you but it's not too different from the code I provided.  Hint : you can use LOOKUPVALUE without a separate table