如何解决如果与Power Query中的多列匹配
我有两个表,在表2中,B到F的列需要与表1的A到G列匹配。如果匹配,则状态为“是”;如果不匹配,则状态为“否”。
我在Excel中通过以下公式实现输出
G2=IF(AND(SUMPRODUCT((TABLE1!A$2:A$18=B2)*(TABLE1!B$2:B$18=C2))>0,IF(B2="Banana",D2=1,D2>1),SUMPRODUCT((TABLE1!B$2:B$18=C2)*(TABLE1!D$2:D$18=E2))>0,SUMPRODUCT((TABLE1!B$2:B$18=C2)*(TABLE1!E$2:G$18=F2))>0),"YES","NO")
但是如何在Power Query中应用相同的内容。
-
第2行的示例; (在表2中的数据中)项目为123,水果清单为“鳄梨”,区号为“ 3100”,与我的主数据表1匹配,因此状态为“是”。
-
第5行的示例; (在表2中的数据中)该项目为126,水果清单为“鳄梨”,区号为“ West”,与我的主数据表1不匹配,因此状态为“否”。
“鳄梨”“地区代码”仅属于以下销售代码(EU01,US,UK)。
- 第19行的示例;项目为56,水果清单为“西瓜”,没有区号。请参考上述快照。
匹配条件:两个表中匹配的选择条件是“水果列表”和“区域代码”。
数量列条件; qty列不应为空白或0。它总是大于1,期望香蕉的区域代码为“ PP1”和“ KP1”,其始终等于1。
销售代码条件;销售代码列不能为空或0。
解决方法
感谢您在问题中提供足够的细节。
-
您可以尝试下面的代码,它给了您您期望的输出。我不知道如果您要处理很多行,那么该代码的性能如何,因为我无法对其进行测试。最好使用
Table.NestedJoin
而不是Table.Contains
,尽管一旦发现匹配项后Table.Contains
可能会停止检查,在这种情况下更好。 -
我不认为您在检查TABLE2中
SALES CODE
的值是否在列SALES CODE 1
,SALES CODE 2
的任何值中说了什么,表1中的SALES CODE 3
。我认为这就是您Excel公式中的SUMPRODUCT((TABLE1!B$2:B$18=C2)*(TABLE1!E$2:G$18=F2))>0
位所要做的。 -
很明显,您需要用自己的代码/数据替换下面代码中的
table1
和table2
,因为我的代码只是硬编码示例。 -
我建议您尝试使用尽可能多的真实数据,以确保代码能够正常工作,并确保
STATUS
列始终包含您期望其包含的值。 -
您可以使用
TRUE/FALSE
将YES/NO
的值转换为Table.TransformColumns
。我现在将它们保留为TRUE/FALSE
。
let
table1 = Table.FromRows({
{"Avocado","3100",1,"EN","EU01","US","UK"},{"Avocado","3200","3300","4500","8900",{"Star Fruit","WEST","INDIA01","INDIA02","NA"},"NORTH","EAST","SOUTH",{"Banana","KP1","XX1","NA","PP1","XX2",{"Apple","444","BAN03",{"Orange","555","BAN04","BAN05",{"Plum","123",{"Watermelon","","UK"}
},type table [FRUIT LIST = text,AREA CODE = text,QTY = Int64.Type,LANGUAGE = text,SALES CODE 1 = text,SALES CODE 2 = text,SALES CODE 3 = text]),table2 = Table.FromRows({
{"123","Avocado",100,"EU01"},{"124","US"},{"125",{"126",{"127",{"128",null,{"129"," ",{"130","INDIA01"},{"131",""},{"234","Star Fruit",200,{"235",{"236",43,{"237",56,{"238",78,"INDIA02"},{"239",99,{"240",133,{"241",45,{"56","Watermelon",type table [ITEM = text,FRUIT LIST = text,SALES CODE = text]),statusColumn = Table.AddColumn(table2,"STATUS",(currentRow) =>
// Check quantity first since it should be a quick/cheap comparison,especially with short-circuit evaluation.
currentRow[QTY] <> null and (if currentRow[FRUIT LIST] = "Banana" then currentRow[QTY] = 1 else currentRow[QTY] > 1)
// FRUIT LIST && AREA CODE matches any TABLE1 row?
and Table.Contains(table1,currentRow[[FRUIT LIST],[AREA CODE]],{"FRUIT LIST","AREA CODE"})
// AREA CODE && LANGUAGE matches any TABLE1 row?
and Table.Contains(table1,currentRow[[AREA CODE],[LANGUAGE]],{"AREA CODE","LANGUAGE"})
// AREA CODE && SALES CODE matches any TABLE1 row?
and Table.Contains(table1,currentRow,(table1row as record,currentRow as record) =>
table1row[AREA CODE] = currentRow[AREA CODE]
// SALES CODE needs custom treatment as there is no SALES CODE column in TABLE1
and List.Contains(Record.FieldValues(table1row[[SALES CODE 1],[SALES CODE 2],[SALES CODE 3]]),currentRow[SALES CODE])
),type logical)
in
statusColumn
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。