本文涵盖财务模型中实际用到的每一个子句,并提供跨工作表的完整公式示例。
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:如何选择
两者均可跨工作表聚合数据,选择的关键在于使用场景。
| 场景 | QUERY | SUMIFS |
|---|---|---|
| 单一聚合值 | 大材小用 | 更优 |
| 多列输出表格 | 更优 | 操作繁琐 |
| 动态分组 / 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。