You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:59:41