You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按完成状态变更时间统计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:关联的订单ID
  • to_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:24:24