You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Sheets中对含重复键的表执行笛卡尔积合并?

在Google Sheets中实现带重复键的表笛卡尔积(类似Pandas merge)

要实现两个表基于Key列的全量配对(即每个Key下,Sheet1的每一行与Sheet2的每一行组合,生成m*n条记录,和Pandas的merge默认效果一致),可以用以下两种方案:

方案一:简洁的QUERY内连接实现

直接将两个表的所有行做笛卡尔积,再筛选出Key匹配的条目。公式放在Sheet3的A2单元格(需手动在Sheet3的A1:E1添加表头:Key, ValueOne, ValueTwo, ValueThree, ValueFour):

=ARRAYFORMULA(
  QUERY(
    {Sheet1!A2:C, Sheet2!A2:C},
    "select Col1, Col2, Col3, Col5, Col6 where Col1 = Col4",
    0
  )
)

原理说明:

  1. {Sheet1!A2:C, Sheet2!A2:C}:将Sheet1和Sheet2的有效数据(排除表头)拼接成一个6列的大数组:
    • Col1: Sheet1的Key;Col2: Sheet1的ValueOne;Col3: Sheet1的ValueTwo
    • Col4: Sheet2的Key;Col5: Sheet2的ValueThree;Col6: Sheet2的ValueFour
  2. QUERY语句筛选出两个表Key相等的所有行,并只保留需要的列,自动生成所有符合条件的配对组合。

方案二:BYROW+FLATTEN的自定义配对

如果需要更灵活的逻辑控制,可使用BYROW和FLATTEN逐Key生成配对:

=ARRAYFORMULA(
  LET(
    s1, FILTER(Sheet1!A2:C, Sheet1!A2:A<>""),
    s2, FILTER(Sheet2!A2:C, Sheet2!A2:A<>""),
    unique_keys, UNIQUE(s1[Key]),
    final_result, REDUCE("", unique_keys, LAMBDA(acc, current_key,
      LET(
        s1_rows, FILTER(s1, s1[Key]=current_key),
        s2_rows, FILTER(s2, s2[Key]=current_key),
        paired_strings, FLATTEN(s1_rows&"|"&TRANSPOSE(s2_rows)),
        split_pairs, ARRAYFORMULA(SPLIT(paired_strings, "|")),
        {acc; split_pairs}
      )
    )),
    FILTER(final_result, INDEX(final_result,0,1)<>"")
  )
)

原理说明:

  1. LET函数定义变量简化结构:s1和s2是两个表的有效数据,unique_keys提取所有不重复的Key值。
  2. REDUCE遍历每个Key,对当前Key对应的Sheet1和Sheet2行做全配对:
    • 转置Sheet2的行后与Sheet1的行拼接,用FLATTEN生成所有配对的字符串。
    • 拆分字符串为多列后,逐步合并到结果中。
  3. 最后用FILTER去掉初始空行,得到最终结果。

为什么之前的VLOOKUP方案不适用?

你之前尝试的VLOOKUP公式仅能返回每个Key的第一个匹配项,无法遍历Sheet2中同一Key下的所有记录,因此当Sheet2存在重复Key时,无法生成完整的笛卡尔积配对。

内容的提问来源于stack exchange,提问作者realPivo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:37:09