使用具有多个条件的 Xlookup,同时检查它是否包含文本,而不仅仅是精确匹配

问题描述 投票:0回答:1

我确信这可能有点令人困惑,但我有一个类似于此屏幕截图的数据库:

我想要做的是,根据“Info”范围上的数据,将值应用于

Value
范围。为此,我有诸如
=if(A1 = "A", 1, 0)
=if(and(B1 = "red", C1 = "pear"), 1, 0)
之类的公式,这将为我提供第二个屏幕截图:

我的问题是,我需要将这些标准作为用户易于访问和修改的东西,因为我制作了另一张具有标准的工作表,如第三张图片。

我可能遇到的另一个问题是,我可能会得到“梨汁”,而不仅仅是“Info3”中的水果,而且我也需要将其视为“梨”。

我首先想到使用

XLOOKUP
构建一个公式,检查其行是否符合其他表中列出的任何标准,然后从相应的
Value
范围中提取值,但我想不出一个让它与具有复杂标准的人一起工作的方法,例如“红色和梨子”

我知道您可以使用具有多个条件的

XLOOKUP
,使用如下所示的内容:

=XLOOKUP($A2&$B2&$C2,Criteria!$A$2:$A$3&Criteria!$B$2:$B$3&Criteria!$C$2:$C$3,Criteria!E$2:E$3,0)

这样做的问题是,它不适用于只需要与单个条件匹配的行,例如我提到的“A1 = A”。

对于“梨汁”部分,类似的东西可以工作,但我不知道如何让所有这些一起工作。

=XLOOKUP(1,--ISNUMBER(SEARCH("pear",Criteria!$C$2:$C$3)),Criteria!E$2:E$3,2)

我也尝试过使用这个,但“and”函数返回 0,因为“--ISNUMBER”函数不返回 0 和 1。

=XLOOKUP(1,AND(--ISNUMBER(SEARCH(Criteria!A2:A3,A14)),--INSNUMBER(SEARCH(Criteria!B2:B3,B14)),--ISNUMBER(SEARCH(Criteria!C2:C3,C14))),Criteria!E2:E3,0)

数据库也在 PowerQuery 上,因此如果有更简单的方法来实现,那就太好了。

excel excel-formula powerquery xlookup
1个回答
1
投票

假设:

  • A1
    :Info1 中要匹配的值
  • B1
    :Info2 中要匹配的值
  • C1
    :Info3 中要匹配的值
  • All_Combos4
    :包含每个值组合的值的表

要匹配“部分匹配”(假设它们仅出现在

Info3
中),您可以使用以下公式:

=TAKE(
    FILTER(
        All_Combos4,
        (All_Combos4[Info1] = A1) *
            (All_Combos4[Info2] = B1) *
            ISNUMBER(
                SEARCH("*" & All_Combos4[Info3] & "*", C1)
            )
    ),
    ,
    -4
)

数据库
enter image description here

部分

All_Combos4

enter image description here

单行示例
enter image description here

这里是 Power Query M 代码,它还可以从

All_Combos
表中查找匹配值。

在下面的代码中,您的第一个表(数据库)名为

Table1
。您需要更改它以引用您的数据库的实际内容。

另请注意,由于只有三个值列,我只是分别对每一列进行编码,但这可以根据您的实际数据变得更加动态。

此外,此代码允许在

Info2
Info3
中使用多词短语。如果
Info2
永远不会有多词短语,则应更改此设置。

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{
        {"Info1", type text}, {"Info2", type text}, {"Info3", type text}}),
    
    #"Add Value1" = Table.AddColumn(#"Changed Type","Value1", (r)=>
        Table.SelectRows(All_Combos, each [Info1] = r[Info1]
                                            and List.Contains(Text.Split(r[Info2]," "),[Info2])
                                            and List.Contains(Text.Split(r[Info3]," "),[Info3])){0}[Value1], Percentage.Type),
    
    #"Add Value2" = Table.AddColumn(#"Add Value1","Value2", (r)=>
        Table.SelectRows(All_Combos, each [Info1] = r[Info1]
                                            and List.Contains(Text.Split(r[Info2]," "),[Info2])
                                            and List.Contains(Text.Split(r[Info3]," "),[Info3])){0}[Value2], Percentage.Type),
    
    #"Add Value3" = Table.AddColumn(#"Add Value2","Value3", (r)=>
        Table.SelectRows(All_Combos, each [Info1] = r[Info1]
                                            and List.Contains(Text.Split(r[Info2]," "),[Info2])
                                            and List.Contains(Text.Split(r[Info3]," "),[Info3])){0}[Value3], Percentage.Type),
    
    #"Add Sum Values" = Table.AddColumn(#"Add Value3","Sum", each List.Sum(List.LastN(Record.FieldValues(_),3)), Percentage.Type),
    #"Reordered Columns" = Table.ReorderColumns(#"Add Sum Values",{"Info1", "Info2", "Info3", "Sum", "Value1", "Value2", "Value3"})

in
    #"Reordered Columns"
© www.soinside.com 2019 - 2024. All rights reserved.