QUERY 函数是 Google Sheets 里最接近 SQL 的存在——对于 FP&A 工作而言,这一点的价值远超大多数分析师的预期。一个 =QUERY() 就能替代一组层层嵌套的 SUMIFS,从一万行数据中筛选出完整的利润表视图,并完成排序,全部在一个单元格内完成。它的语法基于 Google Visualization API Query Language(官方文档),并非标准 SQL,但一旦掌握差异所在,书写速度比大多数公式方案都要快。
本文不是语法速查手册,而是聚焦于三个核心问题:QUERY 在财务模型中真正能发挥作用的场景、它的已知失效模式,以及什么情况下应该换用其他工具。
QUERY 能做到而 SUMIFS 做不到的事
SUMIFS 做的是聚合,QUERY 返回的是行记录。这是两者最根本的区别,也决定了各自适用的场景。
当你需要为董事会汇报包构建分产品线的边际贡献视图时,SUMIFS 迫使你为每一行的每一个指标单独写一条公式。而 QUERY 可以一次性返回整个数据切片——所有 product_line = "Enterprise" 的行,按营收降序排列,顶部带有标题行。结果会自动溢出填充,数据源更新时报表随之刷新。
根据 Google Workspace 官方文档(QUERY 函数参考),该语言支持 SELECT、WHERE、GROUP BY、ORDER BY、LIMIT 和 LABEL,覆盖了日常报表查询约 80% 的需求。
QUERY 与 SUMIFS 选用对照
| 维度 | QUERY | SUMIFS |
|---|---|---|
| 输出类型 | 多行记录(动态溢出) | 单个聚合值 |
| 排序 | ORDER BY 子句原生支持 | 不支持,需辅助列 |
| 列名控制 | LABEL 子句重命名 | 无 |
| 跨表引用 | 支持,需硬编码列字母 | 支持,可用命名范围 |
| 动态工作表名 | 不支持(查询字符串内) | 配合 INDIRECT 可实现 |
| 聚合函数种类 | 5 种(无 MEDIAN/STDEV) | 可与 MEDIAN 等嵌套 |
| 下游公式引用 | 引用溢出区域即可 | 直接引用单元格 |
| 适用层级 | 报表层、输出工作表 | 计算引擎层 |
多工作表模型的跨表语法
大多数教程都会略过的部分:如何引用其他工作表。语法要求将引用范围直接写入函数调用本身:
=QUERY('利润表'!A:H, "SELECT A, B, C, SUM(F) WHERE B = 'Enterprise' GROUP BY A, B, C LABEL SUM(F) '营收'", 1)
第三个参数(1)告诉 QUERY 数据源有多少行标题行。如果遗漏,标题行会被当作数据处理,导致聚合结果出错。
在以"假设参数"工作表驱动全局模型的架构中,动态日期筛选器的写法如下:
=QUERY('利润表'!A:H, "SELECT A, B, SUM(F) WHERE A >= date '"&TEXT(假设参数!$B$3,"yyyy-mm-dd")&"' GROUP BY A, B", 1)
日期格式在这里至关重要。QUERY 的日期字面量必须是 yyyy-mm-dd,且包裹在 SQL 字符串内的单引号中。格式稍有偏差就会返回解析错误,表现上像是数据问题,排查起来费时费力。
动态筛选的 WHERE 子句
WHERE 子句支持 AND、OR 和 NOT。以差异分析为例,如果需要筛选某个成本中心 2026 年第一季度的实际值与预算值:
=QUERY('总账明细'!A:J, "SELECT B, D, SUM(G), SUM(H) WHERE C = 'CC-412' AND A >= date '2026-01-01' AND A <= date '2026-03-31' GROUP BY B, D ORDER BY SUM(G) DESC", 1)
这条公式返回该成本中心一季度内各部门、各科目的实际金额与预算金额,并按实际支出降序排列,最大差异一目了然。用 SUMIFS 实现同等效果,需要针对每个科目编码逐行复制 4 条公式。
有一个不易察觉的限制:QUERY 的 SQL 字符串内部无法引用命名范围。列引用必须使用字母(A、B、C)或 Col1、Col2 的形式。命名范围可以用作数据源参数,但不能出现在查询字符串内。很多人在尝试写 WHERE account = 某命名范围 时会踩到这个坑——它不会报错,而是静默返回全部数据。
聚合运算与 GROUP BY
QUERY 的 GROUP BY 可以替代数据透视表,用于生成程序化输出。规则是:SELECT 中每一个非聚合函数的列,都必须出现在 GROUP BY 中。违反这一规则会报错:"列 X 不能同时被聚合和不聚合"。
支持的聚合函数:SUM、COUNT、AVG、MAX、MIN,共五个。没有 MEDIAN,没有 STDEV,没有百分位函数——这是硬性天花板。如需超出这五种的计算,要么对 QUERY 输出结果进行二次公式处理,要么改用 ARRAYFORMULA 配合更细粒度的函数。
截至 2026 年 4 月,Google 自 2018 年以来未对 QUERY 的聚合函数集进行过任何扩展。如果你需要按季度计算 EBITDA 中位数,可以先用 QUERY 提取并排序数据行,再对输出范围用辅助公式套用 MEDIAN 函数。
LABEL、FORMAT 与输出格式控制
两个在教程中鲜少出现、但对董事会级别输出至关重要的子句:
LABEL 用于重命名结果的列标题。不加 LABEL 时,聚合列会继承 SUM Revenue 或 avg(E) 这样的名称,内部使用尚可,导出为 PDF 就显得不够专业。
=QUERY('营收'!A:F, "SELECT A, B, SUM(C) GROUP BY A, B LABEL A '期间', B '业务条线', SUM(C) '净营收(千元)'", 1)
FORMAT 将显示格式应用于输出结果,格式字符串与 TEXT() 函数一致。对于董事会汇报包中的金额列:
"... LABEL SUM(C) '净营收' FORMAT SUM(C) '#,##0'"
这样处理后,底层数值仍为数字(模型中其他公式依然可以引用),同时保持整洁的显示效果。
QUERY 在实践中的失效场景
三种值得在上线前就了解的故障模式:
列中存在混合数据类型。 QUERY 根据列中多数值的类型来判断列类型。如果 B 列 95% 是文本,但有 5 个数字单元格,QUERY 会将其视为文本列,在 WHERE 比较中静默跳过这些数字。解决方法是清洗源数据,或添加辅助列强制统一数据类型。
日期列中存在空白单元格。 日期列中一旦出现空白单元格,按日期范围筛选时 QUERY 就会报错。解决方法是加入 WHERE A IS NOT NULL AND A >= date '...' 来过滤空值,或确保数据源范围末尾没有多余的空行。
动态工作表引用。 无法像使用 INDIRECT 那样在 QUERY 中动态引用工作表名称。=QUERY(INDIRECT("'"&A1&"'!A:H"), ...) 在数据源参数层面可行,但查询字符串内的列字母仍须硬编码。对于工作表结构会发生变化的模型,QUERY 的脆弱性远超 SUMIFS。
QUERY 与 SUMIFS 的选用判断
需要返回行记录时用 QUERY——筛选列表、动态报表切片、排序输出。需要在固定单元格返回单一聚合值、供下游公式引用时用 SUMIFS。常见的错误用法是用 SUMIFS 构建本质上是筛选表格的东西,结果不得不手动将公式逐行逐列复制粘贴。
一个典型的适配场景:包含独立"报表"工作表的三表模型,从"总账明细"中提取数据。报表工作表自动保持最新,LABEL 负责列名规范化,ORDER BY 无需手动排序即可将 CFO 最关心的数据优先呈现。
如果你已经在 Google Sheets 工作流中引入了 AI 自动化,QUERY 与之配合效果尤佳:AI 可以生成或修改 SQL 字符串,而不影响整体公式结构。
常见问题
QUERY 函数可以跨多个工作表合并数据吗?
不能直接合并,但可以通过 {范围1; 范围2} 的数组语法将多个范围纵向堆叠后作为数据源传入:=QUERY({'一月'!A:F; '二月'!A:F}, "SELECT ...", 1)。前提是两个范围的列结构完全一致。
QUERY 公式中的日期筛选为什么总是报错?
最常见原因是日期格式不符合要求。QUERY 的日期字面量必须严格使用 yyyy-mm-dd 格式,并包裹在单引号内,例如 date '2026-01-01'。如果日期来自单元格引用,需用 TEXT(单元格, "yyyy-mm-dd") 转换后再拼入查询字符串。
QUERY 返回的结果可以被其他公式引用吗?
可以。QUERY 的输出会动态溢出到相邻单元格,其他公式可以直接引用这些单元格。若需引用整个输出范围,可以使用溢出引用语法(如 A2#),但需注意该范围的行数会随数据变化而改变,下游公式应做相应的容错处理。
QUERY 与数据透视表相比,什么时候应该优先选择 QUERY?
当你需要将报表结果作为公式输入传递给下游计算时,优先选择 QUERY——数据透视表的输出无法被其他公式直接引用。当需要快速探索数据分布、或向不熟悉公式的同事展示汇总结果时,数据透视表的交互体验更直观。
QUERY 函数的性能上限大约在哪里?
根据实际使用经验,单个 QUERY 处理 10 万行以内的数据通常流畅。超过这个量级后,刷新延迟会明显增加,建议考虑在源数据层面预先过滤,或将历史数据归档至独立工作表,以减少 QUERY 的扫描范围。
小结
QUERY 函数在单个表达式中完成筛选、排序和聚合的行记录输出。跨表引用使用标准的 '工作表名称'!范围 语法,并需指定标题行参数。日期筛选要求 yyyy-mm-dd 字符串格式。聚合函数支持五种(SUM、COUNT、AVG、MAX、MIN),无法扩展。WHERE 子句支持 AND/OR/NOT,IS NULL 用于处理空值。在 FP&A 模型中,QUERY 适合报表和输出工作表;SUMIFS 适合计算引擎层,为下游公式提供单一数值。
查看 ModelMonkey 方案——通过对话生成和迭代 QUERY 公式,支持 Google Sheets 和 Excel。