如何实现Tasks表按RiskUniqueIdentificationNo单行汇总任务状态统计?
解决SQL行转列的分组统计需求
没问题,你的核心需求是把按Status分散的统计结果合并到每个RiskUniqueIdentificationNo的单行中,之前的查询之所以失败,是因为你在GROUP BY里还保留了[Status],导致每个编号会按状态拆分成多行。我们可以用条件聚合来实现这个效果:
正确的查询语句
SELECT [RiskUniqueIdentificationNo], COUNT(*) AS TotalNoOfTasks, SUM(CASE WHEN [Status] = 'InProgress' THEN 1 ELSE 0 END) AS InProgressTask, SUM(CASE WHEN [Status] = 'Closed' THEN 1 ELSE 0 END) AS ClosedTask FROM [dbo].[Tasks] GROUP BY [RiskUniqueIdentificationNo]
语句解释
- 只按
RiskUniqueIdentificationNo分组,确保每个编号对应一行结果 COUNT(*)直接统计该编号下的总任务数SUM(CASE...)是条件聚合的核心:对符合状态条件的行标记为1,不符合为0,求和后就是对应状态的任务数量
如果还需要统计你提到的逾期任务(Status != 'Closed'且EndDate < GETDATE()),可以直接在查询里添加对应的聚合项:
SELECT [RiskUniqueIdentificationNo], COUNT(*) AS TotalNoOfTasks, SUM(CASE WHEN [Status] = 'InProgress' THEN 1 ELSE 0 END) AS InProgressTask, SUM(CASE WHEN [Status] = 'Closed' THEN 1 ELSE 0 END) AS ClosedTask, SUM(CASE WHEN [Status] != 'Closed' AND [EndDate] < GETDATE() THEN 1 ELSE 0 END) AS OverdueTasks FROM [dbo].[Tasks] GROUP BY [RiskUniqueIdentificationNo]
示例结果
| RiskUniqueIdentificationNo | TotalNoOfTasks | InProgressTask | ClosedTask | OverdueTasks |
|---|---|---|---|---|
| 1 | 3 | 2 | 1 | 0 |
内容的提问来源于stack exchange,提问作者Asad
相关产品推荐
相关产品推荐

