SELECT AVG(amount) avg_amount, COUNT(amount) sample_cnt
FROM orders WHERE dt = '2026-03-01' AND status = 'paid';

3 月平均客单价报表 61.2 元,按有金额订单算是 86.4 元,差了 25 元,退货单里金额全是 null。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:求平均时用 sum 除以总订单数,null 被当成 0 计入了分母。退货和取消订单金额为空,却和正常订单一起参与平均。SQL 的 avg 本身会忽略 null,代码里改成了手算。

「空值参与平均」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。

处理上按这个顺序:平均只统计有效订单 先过滤金额为空;分母用 count(amount) 而不是 count(*);报表同时给出口径和样本数;用同一批数据分别跑 avg 和手算对比。

确认没问题再收工,平均客单价回到 86.4 元,样本数一栏显示实际参与计算的订单数。

作者 9823189