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

如何用SQL动态计算各供应商连续两期金额的平均值?

解决供应商连续两期金额平均值的灵活计算方案

核心思路

先按供应商+月份聚合每月的总金额,再用窗口函数LAG()获取上一月的总金额,最后计算两月平均值。这种方式无需硬编码月份,完全适配动态日期。

分步实现

1. 聚合每月供应商总金额

先将原始数据按供应商和月份分组,计算每个供应商每月的金额总和:

WITH monthly_vendor_totals AS (
    SELECT
        Date_Col,
        Vendor_col,
        -- 处理示例中带千分位和逗号小数点的金额格式,数值类型可直接用SUM(Amt_col)
        SUM(REPLACE(REPLACE(Amt_col, '.', ''), ',', '.')) AS monthly_total
    FROM your_table_name
    GROUP BY Date_Col, Vendor_col
)

2. 计算连续两期平均值

基于聚合结果,用LAG()窗口函数按供应商分组,获取上一月的总金额后计算平均值:

SELECT
    Date_Col,
    Vendor_col,
    CASE
        -- 第一个月无前置月份,直接返回当月总和
        WHEN LAG(monthly_total) OVER (PARTITION BY Vendor_col ORDER BY Date_Col) IS NULL
            THEN monthly_total
        -- 后续月份计算当月+上月的平均值
        ELSE (monthly_total + LAG(monthly_total) OVER (PARTITION BY Vendor_col ORDER BY Date_Col)) / 2
    END AS Amt_col
FROM monthly_vendor_totals
ORDER BY Date_Col, Vendor_col;

测试结果验证

用你提供的测试数据运行上述代码,会得到与期望一致的结果(可按需用FORMAT()调整金额显示格式):

Date_Col  Vendor_col   Amt_col
202201   ABC          226468.30
202201   DEF          845678.45
202201   GHI          450657.43
202202   ABC          138581.36  -- (226468.30 + 50694.45)/2
202202   DEF          552276.73  -- (845678.45 + 258875.01)/2
202202   GHI          450328.72  -- (450657.43 + 450000.00)/2
202203   ABC          31647.48   -- (50694.45 + 12600.50)/2
202203   DEF          159737.81  -- (258875.01 + 60600.60)/2

方案优势

  • 无需硬编码任何月份分支,完全动态适配任意时间范围的历史数据
  • 窗口函数实现逻辑清晰,性能优于多次CASE WHEN判断
  • 聚合+窗口函数的分层写法易于维护和扩展

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:59:52