跳转到内容

跨表公式

跨表公式是一种独立的字段类型,它和行内公式共用同一套公式引擎和全部函数(IF、比较、&&SUMCONCATENATE……),只是多了一组跨表函数——LOOKUP(取值)、COUNTIF/SUMIF/JOINLOOKUP(过滤/聚合)——让你不用先建关联,就能按条件从另一张表里查值/统计,再用现成函数任意加工。用完还能一键固化为真正的关联字段

行内公式(ƒ)跨表公式(ƒ⤫)
引用范围只能引用本表{列名}本表列 {列名} + 目标表列 {表名·列名}
跨表函数❌ 不能用 LOOKUP✅ 可用 LOOKUP
计算时机数据一变就重算、结果存进表里打开时临时算、不存进表里
实时性引用列一变立即重算不保证实时,靠「刷新重算」
排序 / 搜索 / 分组 / 筛选✅ 支持(值存进表里)❌ 全部不支持(值不存进表里,见下)
适用本行内的计算从别的表带数据过来
LOOKUP(返回列, 条件)
  • 返回列:目标表里要取回的列,必须带表前缀,如 {商品·单价}
  • 条件:任意公式表达式,对目标表每一行求值,取第一条为真的那行的返回列;无命中返回空

条件里可以混用本表列和目标表列,也能用比较 / && / || 组合:

LOOKUP({商品·库存}, {商品·商品名} = {商品名} && {商品·单价} < 8)

条件不止等值——想按「包含」匹配用 CONTAINS(不区分大小写)或 FIND(区分大小写、找不到返 0):

LOOKUP({商品·库存}, CONTAINS({商品·商品名}, {关键词}))
LOOKUP({商品·库存}, FIND({关键词}, {商品·商品名}) > 0)

引用语法统一用 {},靠表前缀区分:{列名} 是本行字段,{表名·列名} 是目标表字段。

LOOKUP 只取第一条匹配。如果你要的是「一组满足条件的行」的统计,用下面三个集合函数——它们对目标表里所有满足条件的行做聚合,在单元格里显示一个标量:

函数作用示例
COUNTIF(条件)满足条件的行数(目标表从条件里的 {表.列} 自动推断)COUNTIF({订单·商品名} = {商品名}) → 该商品的订单数
SUMIF({表.列}, 条件)满足条件的行对某列求和SUMIF({订单·数量}, {订单·商品名} = {商品名}) → 总销量
AVERAGEIF({表.列}, 条件)满足条件的行对某列求平均(跳过空;无命中为空)AVERAGEIF({订单·金额}, {订单·商品名} = {商品名}) → 平均客单
MINIF({表.列}, 条件)满足条件的行某列最小值MINIF({订单·单价}, {订单·商品名} = {商品名})
MAXIF({表.列}, 条件)满足条件的行某列最大值MAXIF({订单·单价}, {订单·商品名} = {商品名})
JOINLOOKUP({表.列}, 条件, 分隔符?)满足条件的行某列拼成一串(分隔符默认 ", "JOINLOOKUP({订单·下单人}, {订单·商品名} = {商品名}) → “张三, 李四”

这套 *IF 聚合与汇总字段的 SUM/AVERAGE/MIN/MAX/COUNT/CONCATENATE 对齐。一样能和现成函数组合,例如 IF(COUNTIF(...) > 0, "有订单", "滞销")。集合函数同样是临时计算,继承下面所有限制(不存进表里、不能排序/搜索/分组/筛选)。

  1. 加一列,数据类型选 ƒ⤫ 跨表公式
  2. 在「引用的目标表」里勾选公式要引用的表——勾上后它的字段就会出现在下方公式编辑器的字段面板里(显示为「表名·列名」)
  3. 写表达式,可从字段面板点选列、从函数面板点选 LOOKUP 等函数
  4. 保存

跨表公式配置:勾选目标表 + 公式编辑器

假设有一张商品表(商品名 / 单价 / 库存):

商品演示表

订单表(商品名 / 数量)里加三个跨表公式列,从商品表带数据过来:

① 单价 —— 按商品名查回商品表的单价:

LOOKUP({商品·单价}, {商品·商品名} = {商品名})

单价公式配置界面

② 金额 —— 查回单价后 × 本行数量(复用乘法):

LOOKUP({商品·单价}, {商品·商品名} = {商品名}) * {数量}

③ 库存提醒 —— 查回库存后用 IF + 比较判断(复用逻辑函数):

IF(LOOKUP({商品·库存}, {商品·商品名} = {商品名}) < 10, "⚠️缺货", "正常")

库存提醒字段配置界面

效果(西瓜在商品表里没有,是未命中的例子):

订单演示跨表公式表

LOOKUP 没匹配到任何行时返回。空值参与运算时会按公式规则强制转换,这点要留意:

写法未命中(如上例「西瓜」)显示原因
LOOKUP(...)纯查值,没命中就是空
LOOKUP(...) * {数量}0空在算术里当 00 * 1 = 0
IF(LOOKUP(...) < 10, ...)< 10 为真的分支空在比较里当 00 < 10 成立

想区分「真的没匹配」和「匹配到 0」,用 ISBLANK 兜底:

IF(ISBLANK(LOOKUP({商品·库存}, {商品·商品名} = {商品名})), "无此商品",
IF(LOOKUP({商品·库存}, {商品·商品名} = {商品名}) < 10, "⚠️缺货", "正常"))

跨表公式是临时取数的手段。当它本质上是「按条件匹配到目标记录」时,可以一键把这层匹配固化成一个真正的单向关联字段——把临时取数变成正式的表间关联。取值(LOOKUP)和过滤(COUNTIF/SUMIF/JOINLOOKUP)都能固化:它们都以「条件」框定了一组目标行,固化就是把这组行连成关联。

在跨表公式列头菜单里选:

  • 固化为关联(全部匹配):把每行所有满足条件的目标记录都连上(多值关联)。filter 类(COUNTIF/SUMIF/JOINLOOKUP)通常用这个——匹配的一组行就成了多值关联,之后可再挂汇总字段做计数/求和。
  • 固化为关联(仅首条):只连第一条匹配(单值关联,与 LOOKUP 取首条一致)。

跨表公式列头菜单:固化为关联(全部匹配 / 仅首条)

生成的是一个新的单向关联字段,原来的跨表公式列保持不动,由你确认无误后自行删除。

适用条件(闸门):只有当表达式顶层就是一个跨表函数LOOKUP / COUNTIF / SUMIF / AVERAGEIF / MINIF / MAXIF / JOINLOOKUP)时才提供「固化为关联」——这种形态才有干净的匹配关系。若把跨表函数包在运算/IF 里(如 LOOKUP(...) * {数量}IF(COUNTIF(...) > 0, ...))或顶层不是跨表函数,菜单不出现;请先把里面的跨表函数拆成单独一列再固化。

「固化为关联」是把整列一次性固化成一个新建的关联字段(快照)。但数据是会变的——今天没匹配上的行,明天可能就匹配上了;快照不会自动跟上。这时不必重新固化整列,可以对某一格增量补写

右键一个跨表公式单元格 → 「更新到关联字段」 → 在子菜单里挑一个目标关联字段,就把这一行当前的匹配结果并进那个已有的关联字段里。

单元格右键「更新到关联字段」,子菜单里选目标关联字段

它和「固化为关联」是一对搭档,分工如下:

固化为关联(列头菜单)更新到关联字段(单元格右键)
作用范围整列所有行只当前这一格(一行)
目标字段新建一个关联字段并入一个已有的关联字段
写入方式全量覆盖(快照)并集去重、只增不删
用途第一次把关系固化下来数据更新后,增量补上新匹配

写入规则:把本行匹配到的记录并入目标关联字段——已有的关联原样保留、不会被删,只把新出现的匹配追加进去(自动去重,不会重复添加)。若目标是单值关联字段,则仅当它当前为空时填入首条匹配,已有值保持不动。因此这个操作是幂等的:没有新匹配时点了也不会有任何变化。

什么时候能用:菜单项只在同时满足以下两条时出现——

  • 该跨表公式可固化(顶层就是一个跨表函数,同固化为关联的闸门);
  • 本表里已经有一个指向公式目标表的关联字段,作为并入的目标。子菜单会列出所有符合的关联字段让你挑;一个都没有时,请先用固化为关联建一个。
  • 引用字段汇总字段都要先建关联字段,沿关联关系取值 / 聚合,结果会存进表里、可排序筛选。
  • 跨表公式不用建关联,靠公式条件动态匹配,胜在灵活(条件任意、结果可加工),代价是临时计算、不保证最新、不能排序筛选。

需要稳定、可排序、走既有关联关系的取值,用引用 / 汇总;需要临时按条件从别的表捞数据再加工,用跨表公式。