数据分析

Google Sheets QUERY 语法完整指南:子句、跨表引用与常见错误

ModelMonkey2026年5月16日阅读约 3 分钟

本文涵盖财务模型中实际用到的每一个子句,并提供跨工作表的完整公式示例。

QUERY 语法的基本结构

=QUERY(data, "SELECT col [WHERE condition] [GROUP BY col] [ORDER BY col] [LIMIT n] [LABEL col 'name'] [FORMAT col 'pattern']", headers)

根据 Google 官方 QUERY 函数文档(support.google.com/docs,2026年5月核实),支持的子句及其顺序依次为:SELECT、WHERE、GROUP BY、PIVOT、ORDER BY、LIMIT、OFFSET、LABEL、FORMAT。子句顺序不可调换--将 WHERE 置于 GROUP BY 之后,立刻触发解析错误。

列的引用方式为位置序号--Col1、Col2 等--而非列标题名称。这是从 SQL 迁移过来的用户最常踩的第一个坑。

=QUERY('原始数据'!A:F,
  "SELECT Col1, Col2, SUM(Col4)
   WHERE Col3 = '华东区'
   GROUP BY Col1, Col2
   ORDER BY SUM(Col4) DESC",
  1)

末尾的 1 表示将数据区域的第一行作为标题行。无标题行时使用 0,让函数自动判断则使用 -1。

WHERE 子句:QUERY 语法核心规则

WHERE 子句是大多数语法错误的高发地带。核心规则如下:

字符串须用单引号括起,置于双引号内的查询字符串中:

WHERE Col2 = '华南区'

数字无需引号:

WHERE Col4 > 250000

日期须使用 date 关键字:

WHERE Col1 >= date '2026-01-01'

单元格引用不能直接嵌入字符串字面量--需在字符串外通过拼接方式引入:

=QUERY('利润表'!A:E,
  "SELECT Col1, Col3, Col4
   WHERE Col2 = '" & 参数设置!$B$5 & "'
   AND Col4 > " & 参数设置!$C$3,
  1)

这就是将 QUERY 与参数设置工作表联动的标准做法。$B$5 控制区域筛选条件,$C$3 设定营收下限--修改任意一个单元格,整个查询立即重新计算,所有输出动态刷新。

空值处理:QUERY 默认过滤掉分组列中含空值的行。若汇总含缺失数据的人员编制表,建议用 IFERROR 包裹,或提前将空白单元格填充为 ""。

跨工作表财务模型的 QUERY 语法

单工作表的 QUERY 公式只适合演示用途。真实的财务模型需要跨表拉取数据。

按产品线计算贡献毛利,数据来源为交易明细表:

=QUERY('交易明细'!A:H,
  "SELECT Col3, SUM(Col5), SUM(Col6), SUM(Col5)-SUM(Col6)
   WHERE Col8 = 'Q1 2026'
   AND Col2 != '内部往来'
   GROUP BY Col3
   ORDER BY SUM(Col5)-SUM(Col6) DESC
   LABEL Col3 '产品线', SUM(Col5) '营收', SUM(Col6) '销售成本', SUM(Col5)-SUM(Col6) '毛利'",
  1)

这一公式从 4200 行交易数据中直接汇总各 SKU 的贡献毛利,无需数据透视表,也不依赖任何辅助列。

用于资金储备敏感性分析的滚动人员编制汇总:

=QUERY(人员编制!$A:$G,
  "SELECT Col2, Col3, SUM(Col5)
   WHERE Col6 = '" & 看板!$B$2 & "'
   AND Col4 >= date '" & TEXT(看板!$B$3,"yyyy-mm-dd") & "'
   GROUP BY Col2, Col3
   ORDER BY Col2",
  1)

看板!$B$2 存放部门筛选条件,看板!$B$3 存放起始日期。修改任意一项,包含 12 个主体的合并模型将立即重新计算资金储备预测。

GROUP BY、PIVOT 与聚合函数语法

GROUP BY 要求 SELECT 中所有未经聚合的列也必须出现在 GROUP BY 中--这是标准 SQL 的惯例,但 QUERY 只会抛出 Invalid query: Column [X] is not in grouping,不作任何进一步说明。

PIVOT 是大多数分析师尚未掌握的子句,它将 GROUP BY 的结果转置为交叉表格式:

=QUERY('利润表'!A:E,
  "SELECT Col1, SUM(Col4)
   WHERE Col3 != '内部往来'
   GROUP BY Col1
   PIVOT Col2",
  1)

若 Col2 为季度字段(Q1、Q2、Q3、Q4),该公式将生成"主体 × 季度"维度的营收交叉表--一个公式搞定,无需辅助列,无需手动刷新数据透视表。列标题随数据动态扩展,在数据源中新增 Q5 数据后,交叉表自动增列。

支持的聚合函数(来源:GViz 查询语言参考文档,developers.google.com/chart/interactive/docs/querylanguage,2026年5月版本):SUM、AVG、COUNT、MAX、MIN。MEDIAN 和 STDEV 不在支持范围内--如需这两个指标,需在 QUERY 输出结果外层嵌套数组公式。

LABEL 与 FORMAT:为董事会报告整理输出格式

QUERY 的原始输出以列序号作为标题(字面显示 SUM(Col4))。准备季度董事会报告时,需要可读的列名和规范的数字格式。

=QUERY('营收'!A:F,
  "SELECT Col1, SUM(Col4), AVG(Col4), MAX(Col4)
   WHERE Col2 = '经常性'
   AND Col3 >= date '2026-01-01'
   GROUP BY Col1
   ORDER BY SUM(Col4) DESC
   LABEL Col1 '细分市场', SUM(Col4) 'ARR合计', AVG(Col4) '平均客单价', MAX(Col4) '最大单笔合同'
   FORMAT SUM(Col4) '¥#,##0', AVG(Col4) '¥#,##0', MAX(Col4) '¥#,##0'",
  1)

FORMAT 接受标准 Google Sheets 数字格式字符串:¥#,##0 用于整元金额,¥#,##0.00 保留分位,#,##0.0% 用于百分比。格式化仅影响显示效果,底层单元格仍为数值,因此针对此输出的下游 SUMIFS 公式可正常运行。

需注意:FORMAT 作用于 QUERY 输出单元格的渲染方式,而非单元格格式本身。若将输出内容复制到其他工作表,格式会丢失。用于董事会报告前,建议先执行"选择性粘贴-仅粘贴值"。

QUERY 语法 vs. SUMIFS:如何选择

两者均可跨工作表聚合数据,选择的关键在于使用场景。

场景QUERYSUMIFS
单一聚合值大材小用更优
多列输出表格更优操作繁琐
动态分组 / PIVOT唯一选项不支持
跨表引用命名区域需字符串拼接=SUMIFS('利润表'!C:C,'利润表'!B:B,">="&参数设置!$B$3)
被下游公式引用有风险(输出行列可能偏移)单元格引用稳定
数据源超5万行较慢较快

SUMIFS 适合在固定单元格中返回单一数值、供其他公式调用的场景;QUERY 适合生成用于汇报的格式化表格输出。两者混用往往是最优解:模型逻辑用 SUMIFS,输出展示用 QUERY。

常见 QUERY 语法错误排查

PARSE_ERROR 是什么原因?

通常是子句顺序错误,或字符串缺少闭合的单引号。检查拼接部分,确认每个 ' 都有对应的结尾。

为什么报错 Invalid query: Column [ColN] is in SELECT but not in GROUP BY?

部分列使用了聚合函数,但未将非聚合列加入 GROUP BY。将所有不含聚合函数的 SELECT 列逐一补入 GROUP BY 即可。

日期筛选为何报 Invalid query: Unable to parse date string?

日期拼接未生成 yyyy-mm-dd 格式。用 TEXT(日期单元格,"yyyy-mm-dd") 包裹处理,例如:"date '" & TEXT(参数设置!$B$3,"yyyy-mm-dd") & "'"。

查询没有报错,但返回 #N/A 且无任何提示,是什么情况?

查询返回 0 行,通常是筛选条件未匹配到任何数据。需注意:QUERY 区分大小写,'华东区' 与 '华东区 '(含尾部空格)是不同的值,可用 TRIM 清洗数据源。

#VALUE! 错误如何处理?

数据源列中存在混合数据类型。QUERY 认定为数值列的字段,若包含哪怕一个文本单元格,数值比较即会报错。请清洗数据源,或使用 ISNUMBER 预先过滤。

命名区域与 QUERY 性能

截至 2026年5月,命名区域可直接用作 QUERY 的 data 参数:

=QUERY(交易台账,
  "SELECT Col1, Col2, SUM(Col5)
   WHERE Col3 = '实际数'
   GROUP BY Col1, Col2",
  1)

这样既提升了公式可读性,也将查询逻辑与工作表的物理结构解耦。调整工作表结构时,只需更新命名区域定义,所有引用该区域的 QUERY 公式自动生效。

数据区域超过 5 万行后,性能会明显下降。QUERY 在数据源区域内任意单元格发生变动时都会重新计算。对于大型交易流水数据,建议先通过辅助工作表筛选至较小的工作区域,再对该区域运行 QUERY--重新计算耗时可缩短至原来的十分之一。

若需跨两个区域关联数据--例如将交易 ID 与参考主数据匹配--QUERY 原生不支持 JOIN 操作。此时需要提前合并数据,或借助 ModelMonkey:其内嵌 DuckDB 引擎,可直接对工作表区域执行标准 SQL,支持 JOIN、窗口函数以及 QUERY 不支持的各类聚合运算。

小结

Google Sheets QUERY 语法让你无需离开电子表格即可实现类 SQL 报表分析:子句顺序固定(SELECT → WHERE → GROUP BY → PIVOT → ORDER BY → LABEL → FORMAT),列引用使用位置序号(Col1、Col2),单元格引用通过字符串拼接方式引入查询条件。输出表格与董事会报告展示用 QUERY;供其他公式依赖的模型逻辑用 SUMIFS。

查看 ModelMonkey 方案