Forum Discussion

NMahi1703's avatar
NMahi1703
Frequent Visitor
3 years ago
Solved

Advanced multiple tables join's with conditions

Hi Team, 
I have two tables as below, Need to filter the data based on few conditions as listed.
Table1:

IDAccount ID
18113630
32917625
55677625
55673631
32013631

Table2:

Account NumberBilliDProduct NameVersionAcc Status
3630NAP11Warning
3630NAP22Normal
3630NAP32Normal
3630NAP410Normal
76253291P52Warning
76253291P69Warning
88883291P74Critical
76254691P82Warning
7625 P96Normal
7625 P107Critical
7625 P118Normal
36315567P127Normal
36315567P1310Normal
3631 P145Critical

Expected Output:

IDAccount IDNameStatusAcc Status
18113630P1WarningWarning
18113630P2WarningNormal
18113630P3WarningNormal
18113630P4WarningNormal
32917625P5WarningWarning
32917625P6WarningWarning
55677625P5CriticalWarning
55677625P6CriticalWarning
55677625P8CriticalWarning
55677625P9CriticalNormal
55677625P10CriticalCritical
55677625P11CriticalNormal
55673631p12NormalNormal
55673631p13NormalNormal
32013631p12CriticalNormal
32013631p13CriticalNormal
32013631p14CriticalCritical

Table1 Account ID is has many to many relationship with Account Number.

  • See if this works for you.

    FIrst I created dimension tables using:

    Then create the following measures:

     

    Common Bill ID =
    VAR _Int =
        COUNTROWS (
            INTERSECT ( VALUES ( 'Table 2'[BilliD] ), VALUES ( 'Table 1'[ID] ) )
        )
    RETURN
        IF ( _Int = 1, 1 )
    

     

    To use as a filter in the filter pane, use this measure and set the value to = 1:

     

    Row Filter =
    VAR _AccIDs =
        COUNTROWS (
            INTERSECT (
                VALUES ( 'Account Table'[Account ID] ),
                CALCULATETABLE (
                    VALUES ( 'Table 2'[Account Number] ),
                    FILTER (
                        ALLEXCEPT ( 'Table 2', 'Table 2'[Account Number] ),
                        [Common Bill ID] = 1
                    )
                )
            )
        )
    RETURN
        SWITCH ( TRUE (), [Common Bill ID] = 1, 1, ISBLANK ( _AccIDs ), 1, 0 )
    

     

    To obtain the highest Status by account and filtered rows, use:

     

    Status =
    VAR _ID =
        MAX ( 'Account Table'[Account ID] )
    VAR _ImpValues =
        CALCULATETABLE (
            VALUES ( 'Status Table'[Imp] ),
            FILTER ( ALLSELECTED ( 'Table 2' ), 'Table 2'[Account Number] = _ID )
        )
    VAR _MaxImp =
        MAXX ( _ImpValues, 'Status Table'[Imp] )
    VAR _Status =
        LOOKUPVALUE ( 'Status Table'[Acc Status], 'Status Table'[Imp], _MaxImp )
    RETURN
        IF ( ISBLANK ( MAX ( 'Table 2'[Version] ) ), BLANK (), _Status )
    
    

     

    and you will get:

     Sample PBIX file attached

6 Replies

  • v-yinliw-msft's avatar
    v-yinliw-msft
    Community Support

    Hi NMahi1703 ,

     

    Could you please explain to me about the case1? What is the logic of the case1, i'm a little confused.

     

    Best Regards,

    Community Support Team _Yinliw

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

     

     

    • NMahi1703's avatar
      NMahi1703
      Frequent Visitor

      Hi v-yinliw-msft ,

      Case 1 Explanation: 
      1. We have to create new column called "Status" in the output, which is based on  "Acc Status" Column from Table2.
      2. Tabe2 Acc Status Column may have values like Normal, Warning and Crtical. for Status column we have to consider the Priorty as 1. Critical , 2. Warning and 3.Normal. we need to display the status which has heigest priorty in Status Column.
      3. In Case 1 Tabel1 Account Number is 3630 and ID is 3631. As mentioned Table1 Account ID is has relationship with Account Number.
      4. Below are the column in table2 

      Account Number

      BilliD

      Product Name

      Version

      Acc Status

      3630

      NA

      P1

      1

      Warning

      3630

      NA

      P2

      2

      Normal

      3630

      NA

      P3

      2

      Normal

      3630

      NA

      P4

      10

      Normal

      Above ID value of table is 3631 which is not assosiated with billiD hence need to display all the rows , if ID is assoaited with billiD then we have to display that rows only.
      hence outupt for case1 should be as below.

      ID

      Name

      Status

      Account ID

      Acc Status

      1811

      P1

      Warning

      3630

      Warning

      1811

      P2

      Warning

      3630

      Normal

      1811

      P3

      Warning

      3630

      Normal

      1811

      P4

      Warning

      3630

      Normal