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

MySQL如何计算月度订单总和对比的金额下降百分比

月度订单金额下降百分比计算方案

需求背景

从customer_order表中计算相邻两个月的订单金额环比下降百分比,原有查询仅支持按月统计订单总金额,无法直接输出百分比结果。

原有查询语句

select extract(MONTH from timestamp) as month,sum(order_value) as total_value 
from customer_order 
group by month;

计算规则

月度下降百分比 =(前序月份订单总金额 - 当前月份订单总金额)/ 前序月份订单总金额 * 100

测试样例数据

order_id    customer_id order_value timestamp
101         501         25080.50    2020-09-01 10:00:00
102         502         12055.00    2020-09-12 12:00:00
103         503         1500.50     2020-09-25 16:00:00
104         502         1005.00     2020-10-05 12:00:00
105         501         1200.00     2020-10-18 16:00:00
106         503         15000.00    2020-10-30 16:00:00

实现逻辑

  • 第一步:按年+月维度聚合订单总金额,避免不同年份同月份数据混淆
  • 第二步:用窗口函数LAG()取排序后上一行(即上一个月)的总金额作为计算基准
  • 第三步:代入下降百分比公式计算,结果保留2位小数

可直接运行的SQL代码

WITH monthly_agg AS (
    SELECT
        CONCAT(EXTRACT(YEAR FROM timestamp), '-', LPAD(EXTRACT(MONTH FROM timestamp),2,'0')) AS stat_month,
        EXTRACT(YEAR FROM timestamp) AS y,
        EXTRACT(MONTH FROM timestamp) AS m,
        SUM(order_value) AS month_total
    FROM customer_order
    GROUP BY y, m, stat_month
)
SELECT
    stat_month AS 统计月份,
    month_total AS 当月订单总额,
    LAG(month_total) OVER (ORDER BY y, m) AS 上月订单总额,
    ROUND(
        (LAG(month_total) OVER (ORDER BY y, m) - month_total) 
        / LAG(month_total) OVER (ORDER BY y, m) * 100,
        2
    ) AS 环比下降百分比
FROM monthly_agg
-- 过滤掉没有上月数据的首行可打开下面注释
-- WHERE LAG(month_total) OVER (ORDER BY y, m) IS NOT NULL
;

样例数据计算结果

针对给出的测试数据,最终计算结果:

  • 2020-09订单总额38636.00,无上月数据,环比值为空
  • 2020-10订单总额17205.00,较9月下降55.47%
    提示:如果使用不支持窗口函数的老旧SQL版本,可以通过自关联月度聚合表、匹配月份差值为1的上月数据实现相同计算效果。

内容的提问来源于stack exchange,提问作者user2222

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:09:15