数据分析

Google Sheets QUERY 公式完整指南:FP&A 报表实战应用

Marc Sean2026年4月19日阅读约 3 分钟

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 选用对照

维度QUERYSUMIFS
输出类型多行记录(动态溢出)单个聚合值
排序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。