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

SQL跨表按EOMONTH年月计算累计值 返回条目过多问题求解

解决方案

问题根源

你的原始SQL存在两个核心问题:

  • 语法错误:窗口函数SUM() OVER()缺少PARTITION BY分区维度,且子句没有闭合括号
  • 逻辑错误:直接在关联后的明细数据上使用窗口函数,没有先完成月度维度的聚合,导致窗口计算基于明细行触发,最终出现大量同月份同公司的重复记录

修正后可运行的查询

WITH monthly_agg AS (
    -- 先做月度聚合,保证每个公司每月只有1条记录
    SELECT
        EOMONTH(EP.ProcessedDate) AS month_end,
        EE.CompanyId,
        SUM(CASE WHEN EE.status = 1 THEN 1 ELSE 0 END) AS monthly_active_count
    FROM Employee AS EE
    INNER JOIN payments AS EP ON EE.Id = Ep.Id
    GROUP BY EOMONTH(EP.ProcessedDate), EE.CompanyId
)
-- 基于月度聚合结果计算滚动累计
SELECT
    month_end,
    CompanyId,
    SUM(monthly_active_count) OVER (
        PARTITION BY CompanyId 
        ORDER BY month_end 
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS running_total
FROM monthly_agg
ORDER BY CompanyId, month_end

逻辑说明

  • 内层CTEmonthly_agg优先完成年月+公司维度的聚合,确保每个维度组合仅返回1条当月统计值,从根源上避免重复数据
  • 外层窗口函数新增PARTITION BY CompanyId配置,保证滚动累计是按每个公司单独计算,不会跨公司累加
  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW是滚动累计的标准写法,部分数据库可省略,显式写兼容性更好
  • 如果需要返回所有公司整体的累计值,去掉PARTITION BY CompanyId即可

注意:如果你原始表的公司ID字段名确实带空格(Company ID),请根据你使用的数据库类型对字段名添加对应引用符,避免语法报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:51:03