我确信这可能有点令人困惑,但我有一个类似于此屏幕截图的数据库:
我想要做的是,根据“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 上,因此如果有更简单的方法来实现,那就太好了。
假设:
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
)
部分
All_Combos4
表这里是 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"