Home » Filter Values Based on Table

Filter Values Based on Table

Generate Result table on the basis of T1 and T2. If a given data in T1, doesn’t appear in T2, then this need to be omitted from the Result table. Ex. Psychology

📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 61
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Filter Values Based on Table with Power Query

Power Query solution 1 for Filter Values Based on Table, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  T2 = Table.Buffer(Excel.CurrentWorkbook(){[Name = "Table2"]}[Content]), 
  Join = Table.AddColumn(Source, "Cat", each T2{[Data = [Data]]}?[Category]?), 
  Pivoted = Table.Pivot(
    Join, 
    List.Distinct(T2[Category]), 
    "Cat", 
    "Data", 
    each Text.Combine(_, ", ")
  )
in
  Pivoted
Power Query solution 2 for Filter Values Based on Table, proposed by Zoran Milokanović:
let
  // Table T1 
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  // Table T2 
  Source2 = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
  AddedCategory = Table.AddColumn(Source, "Category", each Source2{[Data = [Data]]}?[Category]?), 
  FilteredNotNulls = Table.SelectRows(AddedCategory, each ([Category] <> null)), 
  GroupedCategoryAndID = Table.Group(
    FilteredNotNulls, 
    {"ID", "Category"}, 
    {{"Data", each Text.Combine(_[Data], ", ")}}
  ), 
  PivotedCategory = Table.Pivot(
    GroupedCategoryAndID, 
    List.Distinct(GroupedCategoryAndID[Category]), 
    "Category", 
    "Data"
  )
in
  PivotedCategory
Power Query solution 3 for Filter Values Based on Table, proposed by Kris Jaganah:
let
  Source = Excel.CurrentWorkbook(), 
  #"Expand" = Table.ExpandTableColumn(
    Source, 
    "Content", 
    {"ID", "Data", "Category"}, 
    {"Content.ID", "Content.Data", "Content.Category"}
  ), 
  #"Renamed" = Table.RenameColumns(#"Expand", {{"Content.ID", "ID"}}), 
  #"Merged" = Table.NestedJoin(
    #"Renamed", 
    {"Content.Data"}, 
    #"Renamed", 
    {"Content.Data"}, 
    "Expanded Content", 
    JoinKind.LeftOuter
  ), 
  #"Expanded" = Table.ExpandTableColumn(
    #"Merged", 
    "Expanded Content", 
    {"ID", "Content.Data", "Content.Category", "Name"}, 
    {
      "Expanded Content.Content.ID", 
      "Expanded Content.Content.Data", 
      "Expanded Content.Content.Category", 
      "Expanded Content.Name"
    }
  ), 
  #"Filter" = Table.SelectRows(
    #"Expanded", 
    each ([Expanded Content.Content.Category] <> null) and ([ID] <> null)
  ), 
  #"Removed" = Table.RemoveColumns(
    #"Filter", 
    {
      "Content.Category", 
      "Name", 
      "Expanded Content.Content.ID", 
      "Expanded Content.Name", 
      "Expanded Content.Content.Data"
    }
  ), 
  #"Grouped" = Table.Group(
    #"Removed", 
    {"ID", "Expanded Content.Content.Category"}, 
    {{"Group", each Text.Combine([Content.Data], ", "), type text}}
  ), 
  #"Pivoted" = Table.Pivot(
    #"Grouped", 
    List.Distinct(#"Grouped"[#"Expanded Content.Content.Category"]), 
    "Expanded Content.Content.Category", 
    "Group"
  )
in
  #"Pivoted"
Power Query solution 4 for Filter Values Based on Table, proposed by Rick de Groot:
let
  Source = Table1, 
  DataType = Table.TransformColumnTypes(Source, {{"ID", Int64.Type}, {"Data", type text}}), 
  CombineTables = Table.NestedJoin(
    DataType, 
    {"Data"}, 
    Table2, 
    {"Data"}, 
    "Table2", 
    JoinKind.LeftOuter
  ), 
  ExpFields = Table.ExpandTableColumn(CombineTables, "Table2", {"Category"}, {"Category"}), 
  RemoveNull = Table.SelectRows(ExpFields, each [Category] <> null), 
  PivotCol = Table.Pivot(
    RemoveNull, 
    List.Distinct(RemoveNull[Category]), 
    "Category", 
    "Data", 
    each Text.Combine(_, ", ")
  )
in
  PivotCol
Power Query solution 5 for Filter Values Based on Table, proposed by Aditya Kumar Darak 🇮🇳:
let
  T1 = Excel.CurrentWorkbook(){[Name = "_T1"]}[Content], 
  T2 = Excel.CurrentWorkbook(){[Name = "_T2"]}[Content], 
  Category = Table.AddColumn(T1, "Category", each T2{[Data = [Data]]}?[Category]?), 
  Filter = Table.SelectRows(Category, each [Category] <> null), 
  Return = Table.Pivot(
    Filter, 
    List.Distinct(Filter[Category]), 
    "Category", 
    "Data", 
    each Text.Combine(_, ", ")
  )
in
  Return
Power Query solution 6 for Filter Values Based on Table, proposed by Aditya Kumar Darak 🇮🇳:
let
  T1       = Excel.CurrentWorkbook(){[Name = "_T1"]}[Content], 
  T2       = Excel.CurrentWorkbook(){[Name = "_T2"]}[Content], 
  Category = Table.AddColumn(T1, "Category", each T2{[Data = [Data]]}?[Category]?), 
  Filter   = Table.SelectRows(Category, each [Category] <> null), 
  Group    = Table.Group(Filter, {"ID", "Category"}, {"Combine", each Text.Combine([Data], ", ")}), 
  Return   = Table.Pivot(Group, List.Distinct(Group[Category]), "Category", "Combine")
in
  Return
Power Query solution 7 for Filter Values Based on Table, proposed by Aditya Kumar Darak 🇮🇳:
let
  T1 = Excel.CurrentWorkbook(){[Name = "_T1"]}[Content], 
  T2 = Excel.CurrentWorkbook(){[Name = "_T2"]}[Content], 
  Join = Table.NestedJoin(T1, "Data", T2, "Data", "Join", JoinKind.Inner), 
  Expand = Table.ExpandTableColumn(Join, "Join", {"Category"}), 
  Return = Table.Pivot(
    Expand, 
    List.Distinct(Expand[Category]), 
    "Category", 
    "Data", 
    each Text.Combine(_, ", ")
  )
in
  Return
Power Query solution 8 for Filter Values Based on Table, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
 Lookup = Table.AddColumn(Source, "Custom", each try Table2{[Data=[Data]]}[Category] otherwise null),
 NoNulls = Table.SelectRows(Lookup, each ([Custom] <> null)),
 Group = Table.Group(NoNulls, {"ID", "Custom"}, {{"Count", each Text.Combine([Data], ", ")}}),
 Sol = Table.Pivot(Group, List.Distinct(Group[Custom]), "Custom", "Count")
in
 Sol
Aplicando Excel BI's video:
https://www.linkedin.com/feed/update/urn:li:activity:7017446873569374208/
                    
                  
          
Power Query solution 9 for Filter Values Based on Table, proposed by Luan Rodrigues:
let
  Fonte = Excel.CurrentWorkbook(){[Name = "Tabela1"]}[Content], 
  Fonte2 = Excel.CurrentWorkbook(){[Name = "Tabela2"]}[Content], 
  mesc = Table.NestedJoin(Fonte2, {"Data"}, Fonte, {"Data"}, "Personalizar1", JoinKind.LeftOuter)[
    [Category], 
    [Personalizar1]
  ], 
  exp1 = Table.ExpandTableColumn(mesc, "Personalizar1", Table.ColumnNames(mesc[Personalizar1]{0})), 
  fil = Table.SelectRows(exp1, each ([ID] <> null)), 
  gp = Table.Group(
    fil, 
    {"ID"}, 
    {{"Contagem", each Table.Group(_, {"Category"}, {{"Count", each Text.Combine(_[Data], ", ")}})}}
  ), 
  exp = Table.ExpandTableColumn(gp, "Contagem", {"Category", "Count"}), 
  res = Table.Pivot(exp, List.Distinct(exp[Category]), "Category", "Count")
in
  res
Power Query solution 10 for Filter Values Based on Table, proposed by Brian Julius:
let
  Source = Table.PromoteHeaders(Excel.CurrentWorkbook(){[Name = "Table1"]}[Content]), 
  Table1 = Table.SelectRows(
    Table.RemoveColumns(Source, {"Column3", "Data_1", "Category"}), 
    each [ID] <> null
  ), 
  Table2 = Table.SelectColumns(Source, {"Data_1", "Category"}), 
  Join = Table.RemoveColumns(Table.Join(Table1, "Data", Table2, "Data_1"), "Data_1"), 
  Group = Table.Group(Join, {"ID", "Category"}, {{"All", each [Data]}}), 
  Extract = Table.TransformColumns(
    Group, 
    {"All", each Text.Combine(List.Transform(_, Text.From), ", "), type text}
  ), 
  Pivot = Table.Pivot(Extract, List.Distinct(Extract[Category]), "Category", "All")
in
  Pivot
Power Query solution 11 for Filter Values Based on Table, proposed by Eric Laforce:
let
  Source1 = Excel.CurrentWorkbook(){[Name = "tData61_1"]}[Content], 
  Source2 = Excel.CurrentWorkbook(){[Name = "tData61_2"]}[Content], 
  Join = Table.Join(Source1, "Data", Source2, "Data"), 
  Group = Table.Group(
    Join, 
    {"ID", "Category"}, 
    {{"Data", each Text.Combine(List.Sort(_[Data]), ", ")}}
  ), 
  Pivot = Table.Pivot(Group, List.Distinct(Group[Category]), "Category", "Data")
in
  Pivot
Power Query solution 12 for Filter Values Based on Table, proposed by Jaroslaw Kujawa:
let
  T1 = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  T2 = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
  Source = Table.NestedJoin(T1{"Data"}, T2, {"Data"}, "Table2", JoinKind.Inner), 
  Expanded = Table.ExpandTableColumn(Source, "Table2", {"Category"}, {"Table2.Category"}), 
  #"Reordered Columns" = Table.ReorderColumns(Expanded, {"ID", "Table2.Category", "Data"}), 
  #"Grouped Rows" = Table.Group(
    #"Reordered Columns", 
    {"ID", "Table2.Category"}, 
    {{"Count", each _, type table [ID = number, Table2.Category = text, Data = text]}}
  ), 
  #"Added Custom" = Table.AddColumn(
    #"Grouped Rows", 
    "Custom", 
    each [
      a = Lines.ToText(Table.ToList(Table.SelectColumns([Count], {"Data"})), ", "), 
      b = Text.Start(a, Text.Length(a) - 2)
    ][b]
  ), 
  #"Removed Columns" = Table.RemoveColumns(#"Added Custom", {"Count"}), 
  #"Pivoted Column" = Table.Pivot(
    #"Removed Columns", 
    List.Distinct(#"Removed Columns"[Table2.Category]), 
    "Table2.Category", 
    "Custom"
  )
in
  #"Pivoted Column"
Power Query solution 13 for Filter Values Based on Table, proposed by Victor Wang:
let
  Source = Table.Join(T1, "Data", T2, "Data"), 
  theFx = (tbl as table, crit as text) as text =>
    Text.Combine(Table.SelectRows(tbl, (a) => a[Category] = crit)[Data], ", "), 
  Group = Table.Group(
    Source, 
    {"ID"}, 
    {
      {
        "all", 
        each [Planet = theFx(_, "Planet"), River = theFx(_, "River"), Subject = theFx(_, "Subject")]
      }
    }
  ), 
  Expand = Table.ExpandRecordColumn(Group, "all", {"Planet", "River", "Subject"}), 
  Sort = Table.Sort(Expand, {{"ID", 0}})
in
  Sort
Power Query solution 14 for Filter Values Based on Table, proposed by Sandeep Marwal:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Custom1 = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
  #"Merged Queries" = Table.NestedJoin(
    Source, 
    {"Data"}, 
    Custom1, 
    {"Data"}, 
    "Table2", 
    JoinKind.Inner
  ), 
  #"Expanded Table2" = Table.ExpandTableColumn(
    #"Merged Queries", 
    "Table2", 
    {"Data", "Category"}, 
    {"Data.1", "Category"}
  ), 
  #"Removed Columns" = Table.RemoveColumns(#"Expanded Table2", {"Data.1"}), 
  #"Pivoted Column" = Table.Pivot(
    #"Removed Columns", 
    List.Distinct(#"Removed Columns"[Category]), 
    "Category", 
    "Data", 
    each Text.Combine(_, ",")
  )
in
  #"Pivoted Column"
Power Query solution 15 for Filter Values Based on Table, proposed by Udit Chatterjee:
let
 Source = pqChallenge61A,
 LookUpTable = pqChallenge61B,
 lookupCategory = Table.AddColumn(
 Source, "Category", each try LookUpTable{[Data = [Data]]}[Category] otherwise null, type text
 ),
 concatenationGrouping = Table.Group(
 lookupCategory, {"ID", "Category"}, {{"Count", each Text.Combine([Data], ", "), type text}}
 ),
 filterNullCategories = Table.SelectRows(concatenationGrouping, each ([Category] <> null)),
 pivotData = Table.Pivot(filterNullCategories, List.Distinct(filterNullCategories[Category]), "Category", "Count")
in
 pivotData
Thanks to Alejandro Simón for pointing to the ExcelBI's  video on alternatives of merging. This is something new to me. Do you have any youtube channel Excel BI 🤔 I would like to see and learn more PowerQuery stuffs... 🧙‍♂️
                    
                  
          
Power Query solution 16 for Filter Values Based on Table, proposed by Gráinne Duggan:
let
  SourceT1 = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  T1 = Table.TransformColumnTypes(SourceT1, {{"ID", type text}, {"Data", type text}}), 
  SourceT2 = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
  T2 = Table.TransformColumnTypes(SourceT2, {{"Data", type text}, {"Category", type text}}), 
  Source = Table.NestedJoin(T1, {"Data"}, T2, {"Data"}, "Table2", JoinKind.Inner), 
  ExpandMergedtbls = Table.ExpandTableColumn(Source, "Table2", {"Category"}, {"Category"}), 
  GroupedIDCategory = Table.Group(
    ExpandMergedtbls, 
    {"ID", "Category"}, 
    {{"Count", each Text.Combine([Data], ", "), type nullable text}}
  ), 
  PivotedCategory = Table.Pivot(
    GroupedIDCategory, 
    List.Distinct(GroupedIDCategory[Category]), 
    "Category", 
    "Count"
  )
in
  PivotedCategory
Power Query solution 17 for Filter Values Based on Table, proposed by kamal shaterian:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  #"Changed Type" = Table.TransformColumnTypes(Source, {{"ID", Int64.Type}, {"Data", type text}}), 
  #"Merged Queries" = Table.NestedJoin(
    #"Changed Type", 
    {"Data"}, 
    Table2, 
    {"Data"}, 
    "Table2", 
    JoinKind.Inner
  ), 
  #"Expanded Table2" = Table.ExpandTableColumn(
    #"Merged Queries", 
    "Table2", 
    {"Category"}, 
    {"Category"}
  ), 
  #"Grouped Rows" = Table.Group(
    #"Expanded Table2", 
    {"ID", "Category"}, 
    {{"Merged", each Text.Combine([Data], ","), type nullable text}}
  ), 
  #"Pivoted Column" = Table.Pivot(
    #"Grouped Rows", 
    List.Distinct(#"Grouped Rows"[Category]), 
    "Category", 
    "Merged"
  )
in
  #"Pivoted Column"

Solving the challenge of Filter Values Based on Table with Excel

Excel solution 1 for Filter Values Based on Table, proposed by Bo Rydobon 🇹🇭:
=LET(a,A2:A16,b,B2:B16,d,D2:D26,e,E2:E26,h,TOROW(UNIQUE(e)),i,UNIQUE(a),HSTACK(VSTACK(A1,i),VSTACK(h,MAP(IFNA(i,h),IFNA(h,i),LAMBDA(j,k,TEXTJOIN(", ",,REPT(b,(a=j)*(XLOOKUP(b,d,e,0)=k))))))))
Excel solution 2 for Filter Values Based on Table, proposed by 🇰🇷 Taeyong Shin:
=LET(d,B2:B16,PIVOTBY(A2:A16,VLOOKUP(d,D2:E26,2,),d,ARRAYTOTEXT,,0,,0,,COUNTIF(D2:D26,d)))

=LET(i,A2:A16,d,B2:B16,a,E2:E26,MAKEARRAY(MAX(i)+1,ROWS(UNIQUE(a))+1,LAMBDA(r,c,IFS(r=1,INDEX(VSTACK(A1,a),c,1),c=1,r-1,1,TEXTJOIN(", ",,REPT(d,(i=r-1)*(XLOOKUP(d,D2:D26,a,0)=INDEX(UNIQUE(a),c-1,1))))))))
Excel solution 3 for Filter Values Based on Table, proposed by Kris Jaganah:
=LET(a,A2:A16,b,B2:B16,c,D2:D26,d,E2:E26,e,XLOOKUP(b,c,d,""),f,FILTER(HSTACK(a,e,b,a&e),e<>""),g,UNIQUE(TAKE(f,,-1)),h,MAP(g,LAMBDA(x,ARRAYTOTEXT(FILTER(CHOOSECOLS(f,3),TAKE(f,,-1)=x)))),i,UNIQUE(a),j,TOROW(UNIQUE(CHOOSECOLS(f,2))),VSTACK(HSTACK("ID",j),HSTACK(i,XLOOKUP(i&j,g,h,""))))

_x000D_

Excel solution 4 for Filter Values Based on Table, proposed by Aditya Kumar Darak 🇮🇳:
=LET(
 _t1, A2:B16,
 _t2, D2:E26,
 _id, TAKE(_t1, , 1),
 _d, TAKE(_t1, , -1),
 _ct, IFNA(VLOOKUP(_d, _t2, 2, 0), ""),
 _fct, UNIQUE(FILTER(_ct, _ct <> "")),
 _fid, UNIQUE(_id),
 _e, LAMBDA(r, c,
 ARRAYTOTEXT(
 FILTER(
 _d,
 (_id = INDEX(_fid, r)) * (_ct = INDEX(_fct, c)),
 ""
 )
 )
 ),
 _fd, MAKEARRAY(ROWS(_fid), ROWS(_fct), _e),
 _r, VSTACK(HSTACK("Id", TOROW(_fct)), HSTACK(_fid, _fd)),
 _r
)

_x000D_

_x000D_

Excel solution 5 for Filter Values Based on Table, proposed by Hussein SATOUR:

=LET(I, A2:A16, di, B2:B16, ci, XLOOKUP(di, D2:D26, F2:F26,""), ui, UNIQUE(I), uci, UNIQUE(ci), z, MAP(ui&TOROW(uci), LAMBDA(x, ARRAYTOTEXT(FILTER(di, I&ci = x,"")))),
HSTACK(VSTACK("ID", ui), DROP(VSTACK(TOROW(uci),z),,-1)))


_x000D_

_x000D_

Excel solution 6 for Filter Values Based on Table, proposed by Oscar Mendez Roca Farell:

=LET(_a;A2:A16;_b;B2:B16;_d;D2:D26;_e;E2:E26;
_m;IFNA(HSTACK(_a;_b;XLOOKUP(_b;_d;_e));"");
 _v;TOROW(UNIQUE(_e))&UNIQUE(_a);_w;ROWS(_v);
 _r;WRAPROWS(IFERROR(SCAN("";SEQUENCE(COUNTA(_v));
 LAMBDA(i;x;TEXTJOIN(", ";;FILTER(INDEX(_m;;2);INDEX(_m;;3)&INDEX(_m;;1)=
 INDEX(_v;INT((x-1)/_w)+1;MOD(x-1;_w)+1)))));"");
 _w);VSTACK(HSTACK("ID";TOROW(UNIQUE(_e)));HSTACK(SEQUENCE(_w);_r)))


_x000D_

_x000D_

Excel solution 7 for Filter Values Based on Table, proposed by Duy Tùng:

=LET(a,XLOOKUP(B2:B16,D2:D26,E2:E26,""),u,PIVOTBY(A2:A16,a,B2:B16,ARRAYTOTEXT,,0,,0,,a>""),IF(TAKE(u,1)&TAKE(u,,1)="",A1,u))


_x000D_

_x000D_

Excel solution 8 for Filter Values Based on Table, proposed by Sunny Baggu:

=LET(_uid,UNIQUE(A2:A16),_headers,TOROW(UNIQUE(E2:E26)),_col1,TOCOL(IFNA(_uid&_headers,_uid),,TRUE),
_tbl,HSTACK(A2:A16&XLOOKUP(B2:B16,D2:D26,E2:E26,""),B2:B16),
_op,WRAPCOLS(DROP(REDUCE("",_col1,LAMBDA(a,v,VSTACK(a,ARRAYTOTEXT(FILTER(TAKE(_tbl,,-1),TAKE(_tbl,,1)=v,""))))),1),3),
VSTACK(HSTACK(A1,_headers),HSTACK(_uid,_op)))


_x000D_

_x000D_

Excel solution 9 for Filter Values Based on Table, proposed by Md. Zohurul Islam:

=LET(u,D2:D26,v,E2:E26,p,B2:B16,q,A2:A16,sq,SEQUENCE(ROWS(v)),
w,MAP(u,LAMBDA(x,ARRAYTOTEXT(FILTER(q,p=x,0)))),
a,DROP(REDUCE("",w,LAMBDA(x,y,VSTACK(x,--TEXTSPLIT(y,,", ")))),1),
b,FILTER(a,a<>0),
d,DROP(REDUCE("",b,LAMBDA(x,y,VSTACK(x,IFNA(HSTACK(y,FILTER(p,q=y)),y)))),1),
e,XLOOKUP(DROP(d,,1),u,v,""),
f,PIVOTBY(TAKE(d,,1),e,TAKE(d,,-1),LAMBDA(x,ARRAYTOTEXT(SORT(UNIQUE(x)))),0,0,,0),
g,HSTACK(VSTACK("ID",DROP(TAKE(f,,1),1)),DROP(f,,2)),
g)


_x000D_

_x000D_

Excel solution 10 for Filter Values Based on Table, proposed by Mohamed Helmy:

=LET(
k,FILTER(A2:B16,1-ISNA(XMATCH(B2:B16,D2:D26))),
e,E2:E26,
u,UNIQUE(e),
rr,ROWS(u),
IFERROR(VSTACK(HSTACK(A1,TOROW(u)),HSTACK(UNIQUE(A2:A16), MAKEARRAY(rr,rr,LAMBDA(r,c,LET(
v,FILTER(DROP(k,,1),TAKE(k,,1)=r), ARRAYTOTEXT( TOCOL(IF(XMATCH(v, IF(e=INDEX(u,c),D2:D26,NA())),v,NA()),2))))))),""))


_x000D_
&&

Leave a Reply