Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Join us in Bucharest on Sept 18th for Qlik's AI Reality Tour! Register Now
cancel
Showing results for 
Search instead for 
Did you mean: 
veldetta
Contributor III
Contributor III

Look up data with multiple values

I have 2 tables.  1 table has multiple values in 1 column seperated by a ';' (semi-colon).  I need to match/look up another table that has one of the values.

Table 1:

ID
AAAA;BBBB;CCCC
DDDD
EEEE
FFFF;HHHH
IIII

Table 2:

ID
AAAA
BBBB
CCCC
DDDD
FFFF
GGGG
HHHH

Desired Result:

  

IDMatchMatching Field
AAAAYesAAAA;BBBB;CCCC
BBBBYesAAAA;BBBB;CCCC
CCCCYes
AAAA;BBBB;CCCC
DDDDYesDDDD
FFFFYesFFFF;HHHH
GGGGNo
HHHHYesFFFF;HHHH

How would i go about getting the desired result?

1 Solution

Accepted Solutions
Kushal_Chawda

try this

Data:

LOAD *,SubField(Name,';') as MatchID;

LOAD * Inline [

ID, Name

1, AAAA;BBBB;CCCC

2, DDDD

3, EEEE

4, FFFF;HHHH

5, IIII ];

Left Join(Data)

LOAD ID as MatchID,

     'Yes' as Match;

LOAD * Inline [

ID

AAAA

BBBB

CCCC

DDDD

FFFF

GGGG

HHHH ];

Final:

LOAD Distinct

ID,

Name,

if(isnull(Match),'No',Match) as Match

Resident Data;

DROP Table Data;

View solution in original post

10 Replies
Gysbert_Wassenaar
Partner - Champion III
Partner - Champion III

Table1:

LOAD

     ID as MatchingField,

     SubField(ID,';') as ID

FROM

     SourceTable1

     ;

RIGHT JOIN (Table1)

LOAD ID FROM SourceTable2;

Result:

LOAD

     ID,

     If(Len(MatchingField)>0, 'Yes', 'No') as Match,

     MatchingField

RESIDENT

     Table1

     ;

DROP TABLE Table1;


talk is cheap, supply exceeds demand
veldetta
Contributor III
Contributor III
Author

Thank you!  I believe you're on the right track, however, I didn't explain it correctly.  So I'll try again... I have 2 tables:

Table 1:    

IDName
1AAAA;BBBB;CCCC
2DDDD
3EEEE
4FFFF;HHHH
5IIII

Table 2:  

Name
AAAA
BBBB
CCCC
DDDD
FFFF
GGGG

HHHH

Desired Result:

   

IDNameMatch
1AAAA;BBBB;CCCC Yes
2DDDD Yes
3EEEE No
4FFFF;HHHH Yes
5IIII No
techvarun
Specialist II
Specialist II

Sheet1:

LOAD ID,SubField([Name],';') as Name, Name as NameFull, if(isnull(Previous([Name]))<>0,chr(39)&[Name]&chr(39),Peek(previous_Name)&','&chr(39)&[Name]&chr(39)) as previous_Name INLINE [

ID, Name

    1, AAAA;BBBB;CCCC

    2, DDDD

    3, EEEE

    4, FFFF;HHHH

    5, IIII

];

Sheet2:

LOAD [Name1], if(isnull(Previous([Name1]))<>0,chr(39)&[Name1]&chr(39),Peek(previous_Name1)&','&chr(39)&[Name1]&chr(39)) as previous_Name1

INLINE [

    Name1

    AAAA

    BBBB

    CCCC

    DDDD

    FFFF

    GGGG

    HHHH

];

MaxStringSheet_Name:

load MaxString(previous_Name) as max_Name

Resident Sheet1;

let vmax_Name=Peek('max_Name',-1);

NoConcatenate

FinalSheet1:

load ID,NameFull,[Name] as final_Name, if(Match([Name],$(vmax_Name1))>0,'Yes','No') as [New_Column_Name]

Resident Sheet1;

DROP TABLE Sheet1,Sheet2, MaxStringSheet_Name;

Reference : Compare two column values and create a new column

techvarun
Specialist II
Specialist II

Output

Capture.PNG

qliksus
Specialist II
Specialist II

Folow the approach of Gysbert and use the folllwing in the chart

Dimension: ID , Name

Expression: Concat( Distinct  Match ,',')

effinty2112
Master
Master

Hi Trevel,

Here's an alternative:

[Table 1]:

LOAD * Inline [

ID, Name 

    1, AAAA;BBBB;CCCC 

    2, DDDD 

    3, EEEE 

    4, FFFF;HHHH 

    5, IIII

    ];

TempElements:

LOAD

ID,

SubField(Name,';') as NameElement

Resident [Table 1];

Inner Join(TempElements)

LOAD * Inline [

  NameElement 

    AAAA 

    BBBB 

    CCCC 

    DDDD 

    FFFF 

    GGGG 

    HHHH

    ];

   

    MappingMatch:

    Mapping LOAD

    Distinct

    ID,

    'Yes'

    Resident TempElements;

   

    Drop Table TempElements;

   

    Left Join([Table 1])

    LOAD

    ID,

    ApplyMap('MappingMatch',ID,'No') as Match

    Resident [Table 1];

Giving:

ID Name Match
1AAAA;BBBB;CCCCYes
2DDDDYes
3EEEENo
4FFFF;HHHHYes
5IIIINo

Cheers

Andrew

Gysbert_Wassenaar
Partner - Champion III
Partner - Champion III

Do you want Match to be Yes if at least one part is matched or only when all parts are matched?

What happens when you have this data:


Table1

ID

AAAA

CCCC


Table 2

ID

AAAA;BBBB;CCCC



talk is cheap, supply exceeds demand
veldetta
Contributor III
Contributor III
Author

Yes should show if part of it is matched.

Kushal_Chawda

try this

Data:

LOAD *,SubField(Name,';') as MatchID;

LOAD * Inline [

ID, Name

1, AAAA;BBBB;CCCC

2, DDDD

3, EEEE

4, FFFF;HHHH

5, IIII ];

Left Join(Data)

LOAD ID as MatchID,

     'Yes' as Match;

LOAD * Inline [

ID

AAAA

BBBB

CCCC

DDDD

FFFF

GGGG

HHHH ];

Final:

LOAD Distinct

ID,

Name,

if(isnull(Match),'No',Match) as Match

Resident Data;

DROP Table Data;