dynamicjoinPower Query(Excel)

我有一个大数据表,需要过滤几列。 我想使用内部连接数据表的filter表来获得结果。 问题是filter是dynamic的。

例如,用户可以使用两列进行过滤(select数据与科目= 1001或1002或1003或1004和Tran = 1或2或3)。 表格在下面。

col1 col2 Acct Tran ==== ==== 1001 1 1002 2 1003 3 1004 

或者用户可以在表格末尾添加一列,使用三列进行过滤(selectAcct = 1001或1002或1003或1004,Tran = 1或2或3,Dept = a或b或c的数据)。 表格在下面

 col1 col2 col3 Acct Tran Dept ==== ==== ==== 1001 1 a 1002 2 b 1003 3 c 1004 

列和列名称的数量可能会改变。 有人知道如何在Power Query中实现这个function吗? 还是VBA?

非常感谢。

您可以通过以下方式构buildfilter表格:

 Attribute Value ========= ===== Acct 1001 Acct 1002 Acct 1003 Tran 1 Tran 2 ... ... 

这会给你一个固定数量的列,你可以使用Power Query导入。 在您的数据表中,您需要取消转换列以获得相同的结构。 之后,您可以join属性和值列。 将属性旋转到列中以重新获得原始结构。

我将使用Acct和Tran列合并筛选表,并展开Filter.Dept列。

接下来,我将添加一个“匹配”列与公式来评估filter,沿线:

if [Filter.Dept] = null then true else if [Dept] = [Filter.Dept] then true else false

最后我会过滤“匹配”列为TRUE。

请注意,“filter部门”列将始终存在,但对于您的第一个scheme,它可以留空。

我喜欢unpivot解决scheme – 但它可以变得相当缓慢,如果你的BigDataTable是非常大的。 那么你可以使用这个替代scheme:

 = Table.NestedJoin(BigDataTable,Table.ColumnNames(FilterTable),FilterTable,Table.ColumnNames(FilterTable),"NewColumn",JoinKind.Inner) 

它使用以下方式dynamic生成列名称列表:Table.ColumnNames(FilterTable),它返回FilterTable的列名称。 我的期望是,这甚至可以折回到服务器。