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
逻辑说明
- 内层CTE
monthly_agg优先完成年月+公司维度的聚合,确保每个维度组合仅返回1条当月统计值,从根源上避免重复数据 - 外层窗口函数新增
PARTITION BY CompanyId配置,保证滚动累计是按每个公司单独计算,不会跨公司累加 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW是滚动累计的标准写法,部分数据库可省略,显式写兼容性更好- 如果需要返回所有公司整体的累计值,去掉
PARTITION BY CompanyId即可
注意:如果你原始表的公司ID字段名确实带空格(
Company ID),请根据你使用的数据库类型对字段名添加对应引用符,避免语法报错。
内容的提问来源于stack exchange,提问作者Fazza
相关产品推荐
相关产品推荐

