SQL Server 2012中按请求状态用Pivot获取优先级数据的查询问题
修正并添加本周数据筛选的SQL查询
首先,你的原查询存在一个小问题:GROUP BY子句包含了Raisedon列,但SELECT列表里并没有它,这在SQL Server默认的严格模式下会触发报错——因为GROUP BY的列要么需要出现在SELECT中,要么是聚合函数的参数。从你给出的结果示例来看,你是想按ReqStatus和priority分组统计数量,所以Raisedon不需要出现在GROUP BY里,先把这个问题修正。
接下来,我们给查询加上本周数据的筛选条件。SQL Server里有几种常见的本周数据筛选方式,我会根据不同的业务周定义给出对应的写法:
方式一:默认周日为一周起始日
这种写法通过匹配当前年份的当前周数来筛选数据:
SELECT * FROM ( SELECT ReqStatus, [priority] FROM WEEKDATA -- 筛选本周数据:匹配当前年份+当前周数 WHERE DATEPART(YEAR, Raisedon) = DATEPART(YEAR, GETDATE()) AND DATEPART(WEEK, Raisedon) = DATEPART(WEEK, GETDATE()) ) p PIVOT ( COUNT([priority]) FOR [priority] IN (Critical, High, Medium, Low) ) AS pvt;
方式二:周一为一周起始日
如果你的业务定义一周从周一开始,可以通过两种方式实现:
方法1:修改一周起始日设置
SET DATEFIRST 1; -- 临时设置周一为一周的第一天 SELECT * FROM ( SELECT ReqStatus, [priority] FROM WEEKDATA WHERE DATEPART(YEAR, Raisedon) = DATEPART(YEAR, GETDATE()) AND DATEPART(WEEK, Raisedon) = DATEPART(WEEK, GETDATE()) ) p PIVOT ( COUNT([priority]) FOR [priority] IN (Critical, High, Medium, Low) ) AS pvt;
方法2:直接计算本周日期范围(无需修改全局设置)
这种写法通过计算本周一到下周一的时间范围来筛选,更精准,也不会影响其他查询的周起始设置:
SELECT * FROM ( SELECT ReqStatus, [priority] FROM WEEKDATA -- 筛选本周一到周日的数据 WHERE Raisedon >= DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0) AND Raisedon < DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) + 1, 0) ) p PIVOT ( COUNT([priority]) FOR [priority] IN (Critical, High, Medium, Low) ) AS pvt;
关键部分说明
DATEPART(YEAR, Raisedon) = DATEPART(YEAR, GETDATE()):确保数据属于当前年份,避免跨年时周数重复导致的错误筛选。- 日期范围的写法相比周数匹配更可靠,尤其是在跨年周的场景下,不会出现跨年度的周数据被错误包含的情况。
修改后的查询就能正确返回本周内各ReqStatus下不同优先级的统计结果了。
内容的提问来源于stack exchange,提问作者Ram Grandhisila
相关产品推荐
相关产品推荐

