WITH Weeks AS ( | | | -- 假设我们有一个从1到52的周别表 | | SELECT generate_series(1, 52) AS WeekNum | | ), | | BugCounts AS ( | | -- 计算每周的bug数 | | SELECT | | 年份, | | 月份, | | 周别, | | 姓名, | | SUM(bug数) AS WeeklyBugs | | FROM | | 销售表 | | GROUP BY | | 年份, 月份, 周别, 姓名 | | ), | | AllWeeks AS ( | | -- 生成所有可能的年份、月份、周别和姓名的组合 | | SELECT | | DISTINCT y.年份, | | m.月份, | | w.WeekNum AS 周别, | | s.姓名 | | FROM | | (SELECT DISTINCT 年份 FROM 销售表) y | | CROSS JOIN | | (SELECT DISTINCT 月份 FROM 销售表) m | | CROSS JOIN | | Weeks w | | LEFT JOIN | | 销售表 s ON y.年份 = s.年份 AND m.月份 = s.月份 AND w.WeekNum = s.周别 | | GROUP BY | | y.年份, m.月份, w.WeekNum, s.姓名 | | ), | | MonthlyReset AS ( | | -- 按月重置累加器 | | SELECT | | a.*, | | SUM(b.WeeklyBugs) OVER ( | | PARTITION BY a.姓名, a.年份, EXTRACT(MONTH FROM DATE_TRUNC('month', MAKE_DATE(a.年份, a.月份, 1))::DATE) | | ORDER BY a.年份, a.月份, a.周别 | | ) AS MonthlyResetBugs | | FROM | | AllWeeks a | | LEFT JOIN | | BugCounts b ON a.年份 = b.年份 AND a.月份 = b.月份 AND a.周别 = b.周别 AND a.姓名 = b.姓名 | | ) | | SELECT | | 年份, | | 月份, | | 周别, | | 姓名, | | COALESCE(MonthlyResetBugs, 0) AS 累加Bug数 | | FROM | | MonthlyReset | | ORDER BY | | 姓名, 年份, 月份, 周别; |
注意: 示例中使用了generate_series(PostgreSQL特有),其他数据库可能需要不同的方法来生成序列。 MAKE_DATE和DATE_TRUNC也是PostgreSQL的函数,其他数据库可能需要使用不同的日期处理函数。 COALESCE用于将NULL转换为0,确保无bug的周显示为0。 此查询假设您有一个名为销售表的表,且列名与您提供的相符。
这个查询可能需要根据您实际使用的数据库系统进行适当的调整。
|