使用窗口函数+DatePart按周末日期统计工单数量遇问题求助
按周统计工单数量的正确写法
原代码的问题
- 主查询未做
GROUP BY,会返回原表所有行,每行重复相同的统计值,完全不是分组统计的结果 - 子查询没有关联主查询的周数,导致子查询返回全表所有周的统计数据,
DISTINCT只能随机取其中一个,逻辑完全错误 - 错误使用窗口函数:你需要的是分组聚合结果,窗口函数是给每行添加分组统计标记,这里用
GROUP BY加聚合函数更直接 TotalClosed的条件写反了:要统计已关闭工单,应该用ticket_status IN ('Resolved', 'Closed'),而非NOT IN
正确实现代码
如果需求是按工单创建时间的周,统计该周新建工单总数,以及该周新建工单中已关闭的数量,用以下代码:
SELECT DATEPART(week, creation_date) AS WeekEnding, COUNT(ticket_id) AS TotalOpened, -- 该周新建的所有工单 SUM(CASE WHEN ticket_status IN ('Resolved', 'Closed') THEN 1 ELSE 0 END) AS TotalClosed -- 该周新建且已关闭的工单 FROM data GROUP BY DATEPART(week, creation_date) ORDER BY WeekEnding;
如果需求是按工单关闭时间的周,统计该周关闭的工单总数(可额外加本周新建且关闭的数量):
SELECT DATEPART(week, close_date) AS WeekEnding, COUNT(ticket_id) AS TotalClosed, -- 该周关闭的所有工单 COUNT(DISTINCT CASE WHEN DATEPART(week, creation_date) = DATEPART(week, close_date) THEN ticket_id END) AS TotalOpenedClosedSameWeek -- 本周新建且本周关闭的工单 FROM data WHERE ticket_status IN ('Resolved', 'Closed') GROUP BY DATEPART(week, close_date) ORDER BY WeekEnding;
补充说明
- 如果需要更准确的周范围(比如包含年份,避免跨年周重复),可以把
DATEPART(week, creation_date)改成CONCAT(DATEPART(year, creation_date), '-W', DATEPART(iso_week, creation_date))作为周标识 - 窗口函数适合在保留原表所有行的同时,添加分组统计字段(比如每行显示所在周的工单总数),但单纯分组统计用
GROUP BY更高效简洁
内容的提问来源于stack exchange,提问作者yuyibruh
相关产品推荐
相关产品推荐

