SQL新手咨询:如何查询指定列值并生成含状态统计的报表?
解决方案:修正SQL以满足报表需求
原代码存在的核心问题
- 未实现LIVE Status存在ERROR则标记Failure的逻辑
- 硬编码
Sprint='A1',无法支持多Sprint ID查询 - 连接语法混用(逗号连接+FULL JOIN)导致逻辑混乱
- Status判断逻辑不符合需求(用Lap计数替代状态规则)
修正后的SQL代码
WITH LastSprintRecord AS ( -- 获取每个ID+Sprint组合的最后一条记录的Final Status SELECT ID, [Sprint Event] AS Sprint, [Final Status] AS LastFinalStatus FROM Sprint s WHERE Time = ( SELECT MAX(Time) FROM Sprint WHERE ID = s.ID AND [Sprint Event] = s.[Sprint Event] ) ) SELECT s.[Sprint Event] AS Sprint, N.Name, st.State, COUNT(s.LAP) AS [Laps (Count)], MIN(s.Time) AS StartTime, MAX(s.Time) AS EndTime, -- 实现Status规则:先检查是否有ERROR,再取最后一条的Final Status CASE WHEN MAX(CASE WHEN s.[LIVE Status] = 'ERROR' THEN 1 ELSE 0 END) = 1 THEN 'Failure' WHEN lsr.LastFinalStatus = 'Success' THEN 'Success' ELSE 'Unknown' -- 可根据需求自定义其他状态 END AS Status, DATEDIFF(MINUTE, MIN(s.Time), MAX(s.Time)) AS [Elapsed Time (Mins)] FROM Sprint s INNER JOIN Name N ON N.ID = s.ID INNER JOIN State st ON st.ID = s.ID INNER JOIN LastSprintRecord lsr ON lsr.ID = s.ID AND lsr.Sprint = s.[Sprint Event] -- 支持多个Sprint ID查询,可按需添加或修改 WHERE s.[Sprint Event] IN ('A1', 'B1') GROUP BY s.[Sprint Event], N.Name, st.State, lsr.LastFinalStatus
关键修正点说明
处理LIVE Status的ERROR判断:
用MAX(CASE WHEN s.[LIVE Status] = 'ERROR' THEN 1 ELSE 0 END)统计是否存在ERROR记录,只要有一条为ERROR,结果就是1,直接标记为Failure。支持多Sprint ID查询:
将原硬编码的Sprint='A1'改为IN ('A1','B1'),可根据需求扩展更多Sprint ID,或者去掉WHERE条件查询所有Sprint。正确获取最后一条记录的Final Status:
通过CTELastSprintRecord先筛选每个ID+Sprint组合的最新记录,确保取到的是该Sprint下最后一条的Final Status。规范连接语法:
统一使用INNER JOIN(如果需要包含无Sprint记录的ID,可改为LEFT JOIN),避免混用旧语法导致的逻辑错误。补充缺失的Sprint字段:
报表需要Sprint列,所以在SELECT中加入s.[Sprint Event] AS Sprint,并在GROUP BY中包含该字段(同一个ID可能对应多个Sprint)。
内容的提问来源于stack exchange,提问作者SCCM-SQL
相关产品推荐
相关产品推荐

