如何按完成状态变更时间统计WooCommerce月度已完成订单数
查询实现方法
核心统计逻辑严格匹配规则:
- 仅统计状态为
completed的订单 - 订单归属月份以被标记为
completed状态的操作时间为准,和订单创建时间无关 - 最终仅返回「月份」「已完成订单数量」两列结果
根据业务库的表结构设计,分两种常见场景给出可直接复用的SQL:
场景1:订单主表直接存储完成状态及对应时间
如果你的订单主表(表名一般为orders)包含以下核心字段:
order_id:订单唯一标识status:订单当前状态值completed_at:订单被标记为完成的时间(如果使用通用更新时间字段updated_at,需确认该字段不会在订单完成后被其他非状态变更操作修改,否则会出现统计偏差)
使用以下查询即可,示例默认统计近6个月数据,时间范围可按需修改:
-- MySQL版本示例 SELECT DATE_FORMAT(completed_at, '%Y-%m') AS `月份`, COUNT(DISTINCT order_id) AS `已完成订单数量` FROM orders WHERE status = 'completed' AND completed_at >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) GROUP BY `月份` ORDER BY `月份` DESC;
数据库适配提示:如果使用其他数据库,替换对应的时间格式化函数即可:PostgreSQL用
TO_CHAR(completed_at, 'YYYY-MM'),SQL Server用DATENAME(yyyy, completed_at) + '-' + RIGHT('0'+DATENAME(mm, completed_at),2)。
场景2:存在独立的订单状态变更流水表
如果业务侧用独立流水表(表名一般为order_status_log)记录所有状态变更操作,表核心字段为:
order_id:关联的订单IDto_status:变更后的状态值operate_at:状态变更的操作时间
这种表结构统计精度最高,不会受主表后续其他更新操作影响,基础查询语句如下:
SELECT DATE_FORMAT(operate_at, '%Y-%m') AS `月份`, COUNT(DISTINCT order_id) AS `已完成订单数量` FROM order_status_log WHERE to_status = 'completed' AND operate_at >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) GROUP BY `月份` ORDER BY `月份` DESC;
如果业务中存在订单被反复标记为完成/其他状态的异常操作(比如人工误改后又修正),可以先取每个订单最后一次被标记为completed的有效记录再做统计,避免重复计数:
WITH valid_completed AS ( SELECT order_id, MAX(operate_at) AS final_completed_time FROM order_status_log WHERE to_status = 'completed' GROUP BY order_id ) SELECT DATE_FORMAT(final_completed_time, '%Y-%m') AS `月份`, COUNT(order_id) AS `已完成订单数量` FROM valid_completed WHERE final_completed_time >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) GROUP BY `月份` ORDER BY `月份` DESC;
内容的提问来源于stack exchange,提问作者user2996527
相关产品推荐
相关产品推荐

