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

PostgreSQL多客户数据累计求和实现问题求助

实现PostgreSQL多客户月度累计求和

没问题,我来帮你把单个客户的累计求和逻辑扩展到多客户场景~

首先,你原来的CTE是针对cus.id=101单个客户做月度金额汇总,要适配多客户的话,只需要去掉单个客户的过滤条件,同时在分组和窗口函数里按客户维度区分即可。这里用PostgreSQL的窗口函数SUM() OVER()就能轻松实现每个客户独立的累计求和,不用单独处理每条记录。

完整实现代码

WITH monthly_sales AS (
    -- 先按客户+月份分组,计算每个客户每月的总金额
    SELECT 
        cus.id AS customer_id,
        cus.name AS customer_name, -- 可选,方便查看客户名称
        date_trunc('month', pe.pdate) AS mon,
        SUM(pei.pamt) AS mon_sum
    FROM pur_entry_item pei
    JOIN pur_entry pe ON pe.id = pei.pid
    JOIN customer cus ON cus.id = pei.cust_id
    -- 这里去掉单个客户的过滤条件,如需筛选特定范围可以加WHERE,比如日期范围
    GROUP BY cus.id, cus.name, date_trunc('month', pe.pdate)
    ORDER BY cus.id, mon
)
SELECT 
    customer_id,
    customer_name,
    mon,
    mon_sum,
    -- 按客户分区,按月度排序,计算累计求和
    SUM(mon_sum) OVER (
        PARTITION BY customer_id 
        ORDER BY mon 
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- 可选,默认就是这个逻辑
    ) AS cumulative_sum
FROM monthly_sales;

关键部分解释

  • 分组调整:原来只按月份分组,现在要加上cus.id(和cus.name,可选),确保每个客户的月度数据单独分组。
  • 窗口函数PARTITION BY:PARTITION BY customer_id会把数据按客户拆分成独立的分组,每个分组内单独计算累计,不会跨客户混算。
  • ORDER BY mon:保证每个客户的累计是按时间顺序从最早月份到当前月份累加的。
  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:这是窗口函数的默认范围,意思是从当前分组的第一行到当前行,也就是累计到当月的总和,写不写都可以,加上是为了更清晰。

额外提示

如果需要只统计特定客户或者特定日期范围,只需要在monthly_sales的CTE里加上WHERE条件即可,比如:

-- 示例:统计2023年的所有客户数据
WHERE pe.pdate BETWEEN '2023-01-01' AND '2023-12-31'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:01:26