Google Sheets QUERY函数无匹配结果时返回0值的问题咨询
问题原因说明
- 第一个QUERY语句没有在SELECT中返回经销商名称列作为匹配依据,且仅返回当月有订单的经销商,自然和B列全量经销商列表顺序无法对齐,无订单的经销商会直接被过滤
- 第二个QUERY直接拼接B2:B整列范围作为查询条件,语法不合法,无法匹配到任何有效结果
解决方案
方案1:单单元格下拉(易理解易调整)
适合需要灵活修改单行逻辑的场景,在对应1月统计的首个单元格(假设B列首行经销商是B2,对应统计从C2开始)输入以下公式,下拉填充即可:
=IFERROR(QUERY('2021ContractsData'!A:V, "Select COUNT(J),SUM(J),AVG(J) WHERE MONTH(A)+1=1 AND H='"&B2&"' LABEL COUNT(J) '',SUM(J) '',AVG(J) ''",0),{0,0,0})
- 把原公式的范围引用
B2:B改为当前行单个单元格B2,逐行匹配对应经销商 - 去掉
Group By H语句,已经限定唯一经销商名称,无需分组 - LABEL字段设为空值,隐藏QUERY默认返回的表头
- 外层套
IFERROR,匹配不到订单时直接返回{0,0,0},对应合同数、总金额、平均值三个统计项的0值 - 需要统计其他月份时,仅需修改
MONTH(A)+1=1中的数字为对应月份即可
方案2:数组溢出公式(无需下拉,一次输入自动生成全量结果)
仅需在C2单元格输入一次公式,自动匹配B列所有经销商,批量生成所有行的统计结果:
=MAP(B2:B,LAMBDA(d, IF(d="","", IFERROR(QUERY('2021ContractsData'!A:V, "Select COUNT(J),SUM(J),AVG(J) WHERE MONTH(A)+1=1 AND H='"&d&"' LABEL COUNT(J) '',SUM(J) '',AVG(J) ''",0), {0,0,0}) ) ))
- 用
MAP遍历B列所有非空的经销商名称,逐行传入查询逻辑 - B列为空时直接返回空值,避免无意义计算
方案3:大数据量优化版(查询效率更高)
如果订单数据量超过1000行,推荐用这个方案,仅执行一次QUERY查询,后续全为内存匹配,运行速度更快:
=LET( // 先一次性查询所有1月有订单的经销商统计结果 stats,QUERY('2021ContractsData'!A:V, "SELECT H,COUNT(J),SUM(J),AVG(J) WHERE MONTH(A)+1=1 AND YEAR(A)=2021 GROUP BY H LABEL H '',COUNT(J) '',SUM(J) '',AVG(J) ''",0), // 批量匹配B列经销商 MAP(B2:B,LAMBDA(d, IF(d="","",IFERROR(INDEX(stats,XMATCH(d,INDEX(stats,0,1)),{2,3,4}),{0,0,0})) )) )
注意事项
- 如果经销商名称包含单引号
',需要把查询条件里的'"&B2&"'替换为'"&SUBSTITUTE(B2,"'","''")&"',避免QUERY语法报错 - 如果有多年度数据,建议在WHERE条件中加
YEAR(A)=2021限定年份,避免统计到其他年份同月份的订单
内容的提问来源于stack exchange,提问作者geneavone
相关产品推荐
相关产品推荐

