Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
NMahi1703
Frequent Visitor

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.case1.PNGCase2.PNGcase3.PNGcase4.PNGcase5.PNG

1 ACCEPTED SOLUTION

See if this works for you.

FIrst I created dimension tables using:

Acc table.jpgBii Id table.jpgStatus table.jpgmodel.jpg

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:

final.gif

 Sample PBIX file attached





Did I answer your question? Mark my post as a solution!
In doing so, you are also helping me. Thank you!

Proud to be a Super User!
Paul on Linkedin.






View solution in original post

6 REPLIES 6
v-yinliw-msft
Community Support
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.

 

 

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

 

@v-yinliw-msft , @Arul @amitchandak @FreemanZ @Mikelytics @MFelix @PaulDBrown @mangaus1111 @Ashish_Mathur @ryan_mayu @PhilipTreacy 


Dear Folks ,I stuck here can you guys provide any solutions.
Thanks

Sorry, I'm not too sure how you are calculating the "Status" field for each account. Is it just picking the highest from Critical > Warning > Normal for each account?





Did I answer your question? Mark my post as a solution!
In doing so, you are also helping me. Thank you!

Proud to be a Super User!
Paul on Linkedin.






Hi @PaulDBrown ,

 

Yes Status column is new column based on priorty of 1.Critical 2.Warning and 3. Normal

See if this works for you.

FIrst I created dimension tables using:

Acc table.jpgBii Id table.jpgStatus table.jpgmodel.jpg

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:

final.gif

 Sample PBIX file attached





Did I answer your question? Mark my post as a solution!
In doing so, you are also helping me. Thank you!

Proud to be a Super User!
Paul on Linkedin.






Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.