如何用单个QUERY函数在Google Sheets中按条件计算多指标平均值
数据
我在Google Sheets中有如下表格:
| 月份 | 国家 | 指标名称 | 数值 |
|---|---|---|---|
| Nov | AAA | Metric_1 | 98 |
| Nov | AAA | Metric_2 | 45 |
| Nov | AAA | Metric_3 | 4 |
| Nov | BBB | Metric_1 | 100 |
| Nov | BBB | Metric_2 | 214 |
| Nov | BBB | Metric_3 | 13 |
| Nov | CCC | Metric_1 | 75 |
| Nov | CCC | Metric_2 | 84 |
| Nov | CCC | Metric_3 | 21 |
| Nov | Worldwide | Metric_4 | 3 |
| Nov | Worldwide | Metric_5 | 87 |
| Oct | AAA | Metric_1 | 94 |
| Oct | AAA | Metric_2 | 41 |
| Oct | AAA | Metric_3 | 0 |
| Oct | BBB | Metric_1 | 96 |
| Oct | BBB | Metric_2 | 210 |
| Oct | BBB | Metric_3 | 9 |
| Oct | CCC | Metric_1 | 71 |
| Oct | CCC | Metric_2 | 82 |
| Oct | CCC | Metric_3 | 17 |
| Oct | Worldwide | Metric_4 | -1 |
| Oct | Worldwide | Metric_5 | 83 |
目标
最终目标是生成一个按月份汇总各指标平均值的表格,如下所示:
| 月份 | Metric_1 | Metric_2 | Metric_3 | Metric_4 | Metric_5 |
|---|---|---|---|---|---|
| Nov | 91 | 114.33 | 12.66 | 3 | 87 |
| Oct | 87 | 109.33 | 8.66 | -1 | 83 |
失败尝试
我最初尝试使用多个VLOOKUP函数,但公式变得越来越繁琐,因此放弃了该方法。
后来我发现了QUERY函数和Google Visualization API Query Language,以下代码仅针对单个指标时有效:
+QUERY(my_table," SELECT Col1, AVG(Col4) WHERE Col3 = 'Metric_1' GROUP BY Col1 LABEL AVG(Col4) 'Metric_1' ",1)
执行后得到:
| 月份 | Metric_1 |
|---|---|
| Nov | 91 |
| Oct | 87 |
但我不清楚如何为每一列应用不同的条件,想知道是否可以在QUERY的SELECT部分集成IF()或AVERAGEIF()之类的函数,例如:
+QUERY(my_table," SELECT Col1, AVERAGEIF(Col3,'=Metric_1',Col4), AVERAGEIF(Col3,'=Metric_2',Col4), AVERAGEIF(Col3,'=Metric_3',Col4), AVERAGEIF(Col3,'=Metric_4',Col4), AVERAGEIF(Col3,'=Metric_5',Col4), GROUP BY Col1 ",1)
如何通过单个QUERY函数得到上述汇总表格?
解决方案
Google Sheets的QUERY语言不支持直接在SELECT子句中使用AVERAGEIF,但有两种简洁的方式实现需求:
方法一:条件聚合+手动指定列
利用AVG(IF(...))的组合,针对每个指标筛选后计算平均值,再通过LABEL设置表头:
=QUERY(my_table, " SELECT Col1, AVG(IF(Col3='Metric_1', Col4, NULL)), AVG(IF(Col3='Metric_2', Col4, NULL)), AVG(IF(Col3='Metric_3', Col4, NULL)), AVG(IF(Col3='Metric_4', Col4, NULL)), AVG(IF(Col3='Metric_5', Col4, NULL)) GROUP BY Col1 LABEL AVG(IF(Col3='Metric_1', Col4, NULL)) 'Metric_1', AVG(IF(Col3='Metric_2', Col4, NULL)) 'Metric_2', AVG(IF(Col3='Metric_3', Col4, NULL)) 'Metric_3', AVG(IF(Col3='Metric_4', Col4, NULL)) 'Metric_4', AVG(IF(Col3='Metric_5', Col4, NULL)) 'Metric_5' ", 1)
IF(Col3='Metric_X', Col4, NULL):仅保留匹配指标的数值,其余返回NULL(聚合函数会自动忽略NULL)AVG(...):对筛选后的数值计算平均值- 参数
1表示数据源包含表头行
方法二:使用PIVOT子句(更简洁)
QUERY的PIVOT子句可以自动将指标名称转为列,同时完成分组聚合,公式更简洁且扩展性强(新增指标无需修改公式):
=QUERY(my_table, " SELECT Col1, AVG(Col4) GROUP BY Col1 PIVOT Col3 ", 1)
这个公式会自动按月份分组,把指标名称列的所有唯一值作为表头列,计算对应数值的平均值,结果完全符合目标表格要求。
内容的提问来源于stack exchange,提问作者Martian Arts
相关产品推荐
相关产品推荐

