AVG(order_amount) 不加 GROUP BY store_id 得到的是全表平均值而非各店铺单均消费必须显式分组且 SELECT 与 GROUP BY 字段需对齐否则结果错误或报错。AVG() 计算单均消费为什么结果不对直接用 AVG(order_amount) 得到的不是“每个店铺的单均消费”而是全表所有订单的平均值——除非你加了 GROUP BY store_id。没分组AVG() 就只返回一行聚合结果和店铺无关。常见错误现象SELECT store_id, AVG(order_amount) 不报错但 store_id 值随机MySQL 5.7 严格模式下直接报错 Expression #1 of SELECT list is not in GROUP BY clause必须显式写 GROUP BY store_id否则 SQL 语义不成立如果某店铺有 NULL 订单金额AVG() 自动跳过它不影响该店计算——这是正确行为不是 bug分组后怎么排除退款订单单均消费要反映真实销售能力得把 status refunded 或 order_amount 的脏数据过滤掉不能靠后期 WHERE 粗暴截断——那样会漏掉整个店铺只要有一笔退款整店就没了。用 HAVING 不行它是对分组后结果过滤无法筛掉单条记录必须在 GROUP BY 前用 WHERE 过滤原始行WHERE order_amount 0 AND status ! refunded注意 NULL 安全如果 status 可能为 NULL加 AND status IS NOT NULL避免意外丢数据用 AVG() 还是 SUM()/COUNT()结果一样吗数学上等价但行为细节不同当某店铺没有任何符合条件的订单时AVG() 返回 NULL而 SUM()/COUNT() 中 COUNT() 为 0会导致除零错误MySQL 返回 NULLPostgreSQL 报错 division by zero。 OpenPerplex OpenPerplex是一个开源的AI搜索引擎致力于整合多种信息源为用户提供智能精准的搜索体验。