指定团队近7天工单创建/关闭统计SQL查询问题咨询
工单统计问题修正方案
需求说明
需统计指定团队(如abc团队)近7天的以下数据:
- 团队整体的创建工单量与关闭工单量
- 该团队下成员各自的创建、关闭工单数据
样例数据
| 创建日期 | 创建工单量 | 关闭工单量 | 团队 |
|---|---|---|---|
| 6-03-2023 | 9 | 7 | abc |
| 7-03-2023 | 8 | 8 | abc |
| 8-03-2023 | 7 | 9 | abc |
| 9-03-2023 | 10 | 8 | abc |
| 10-03-2023 | 15 | 10 | abc |
现有代码问题分析
你提供的SQL中ClosedCases统计错误,原因是:
- WHERE子句仅筛选了创建时间在近7天的工单,导致
COUNT(CASE WHEN caseentity.statecode=1 THEN 1 END)统计的是「近7天创建且已关闭」的工单,而非需求中的「近7天关闭」的工单,统计范围完全不符。
关于你提到的写法可行性
你问的case when cast(c1.CreatedOn as date) between cast(DATEADD(DAY,-7,GETDATE()) as date) and (c1.StateCode) then COUNT(*) end写法不可行,因为:
StateCode是状态标识(比如1代表关闭),属于数值类型,不能和日期类型做范围比较,这种写法会触发语法或逻辑错误,完全不符合统计逻辑。
修正后的SQL代码
假设工单表filteredIncident存在closedon字段(记录工单关闭时间),以下代码可同时统计团队整体及成员的近7天工单数据:
SELECT al.Name AS [Team Name], ak.FullName AS [Member Name], -- 统计近7天创建的工单量 COUNT(CASE WHEN CAST(caseentity.createdon AS DATE) >= DATEADD(DAY, -7, GETDATE()) THEN 1 END) AS [CreatedCases], -- 统计近7天关闭的工单量(需statecode=1且关闭时间在近7天) COUNT(CASE WHEN CAST(caseentity.closedon AS DATE) >= DATEADD(DAY, -7, GETDATE()) AND caseentity.statecode = 1 THEN 1 END) AS [ClosedCases] FROM filteredIncident AS caseentity JOIN systemuser ak ON ak.systemuserid = caseentity.owninguser JOIN teammembership tm ON tm.systemuserid = ak.systemuserid JOIN team al ON al.teamid = tm.teamid WHERE al.Name = 'abc' GROUP BY al.Name, ak.FullName -- 若需额外生成团队汇总行,可添加 WITH ROLLUP -- GROUP BY al.Name, ak.FullName WITH ROLLUP
代码说明
- 用条件聚合替代WHERE子句的单一筛选,分别判断创建时间、关闭时间是否在近7天,确保两个统计维度的独立性。
- GROUP BY同时包含团队名称和成员名称,可输出每个成员的明细数据;若仅需团队汇总,可去掉
ak.FullName并调整GROUP BY。 - 必须依赖
closedon字段来判断工单是否在近7天关闭,若表中无此字段,需关联状态变更日志表获取关闭时间。
内容的提问来源于stack exchange,提问作者user20971593
相关产品推荐
相关产品推荐

