SQL累加问题

销售表:年份、月份、周别、姓名、bug数、bug解没解决状态

需求:依据姓名,实现单周累加bug数,月度清零  展示数据,

遇到问题:张三在第26周发生两起bug问题,bug还没解决,在第27周没有发生,依旧需要显示,怎么处理?

目前SQL处理,先依据姓名查出每年、每月、每周bug数,再使用

SUM() OVER(PARTITION BY )进行累加,没有实现

SQL 十三SSan 发布于 2024-7-23 11:04
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
0
华莉星宸Lv7资深互助
发布于2024-7-23 11:06

需要先生成一个周的维度表

左关联你的实际表

在累计求和就行了

最佳回答
0
用户k6280494Lv6专家互助
发布于2024-7-23 11:07
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。

  • 此查询假设您有一个名为销售表的表,且列名与您提供的相符。

这个查询可能需要根据您实际使用的数据库系统进行适当的调整。

  • 3关注人数
  • 126浏览人数
  • 最后回答于:2024-7-23 11:07
    请选择关闭问题的原因
    确定 取消
    返回顶部