Google Sheets实现类子查询功能 按月计算单日最高托盘登记量
报错原因
你原公式报错的核心原因是Google Sheets的QUERY函数不支持在聚合函数内直接嵌套另一层聚合(max(sum(D))属于非法语法),QUERY本身支持嵌套子查询,以下是对应实现方案:
方案1:嵌套QUERY函数实现
先通过内层QUERY按日期分组统计每日总登记量,再通过外层QUERY按年月分组取单日登记量的最大值,完整公式如下(如果你的Google Sheets区域使用分号作为公式分隔符,把所有逗号替换为分号即可):
QUERY( QUERY(Days!A:E, "select A, sum(D) where A is not null group by A", 1), "select year(Col1), month(Col1)+1, max(Col2) group by year(Col1), month(Col1) label max(Col2) 'Max day'", 1 )
说明:
- 内层QUERY输出包含「日期、当日总登记量」两列的结果
- 外层QUERY将日期拆分为年、月维度,按年月分组后取单日登记量的最大值,同时通过
label参数将结果列命名为你需要的「Max day」 - 公式返回结果自动包含年、月、Max day三列数据,避免跨年月份统计混淆
方案2:数据透视表实现
单数据透视表无法直接完成两层聚合计算,你可以通过两次透视表快速实现:
- 第一次透视表:数据源选
Days!A:E,行维度添加日期列(A列),值区域添加登记量列(D列),汇总方式选「求和」,得到所有日期对应的单日总登记量 - 第二次透视表:数据源选第一次透视表的输出范围,行维度添加日期列,右键选择「创建日期分组」,勾选「年」「月」确认,值区域添加第一次透视表计算出的单日总登记量字段,汇总方式选「最大值」,将该字段自定义名称改为「Max day」即可
方案3:MAXIFS组合函数实现(更易维护)
如果不想使用嵌套QUERY,可以用数组函数一次性输出所有月份的Max day结果:
BYROW( SORT(UNIQUE(EOMONTH(Days!A2:A, 0))), LAMBDA(month_end, MAXIFS(Days!D:D, Days!A:A, ">="&EOMONTH(month_end, -1)+1, Days!A:A, "<="&month_end)) )
你也可以单独提取不重复的年月列后,逐行写MAXIFS公式计算对应月份的最高单日登记量,逻辑更直观。
内容的提问来源于stack exchange,提问作者BigBenne
相关产品推荐
相关产品推荐

