如何在SQL Server中对Orders表按年份分组实现Status行转列统计及求和
问题描述
有一个SQL Server表Orders,数据如下:
ID | Name | Status | Year ---+--------+---------+------ 1 |ckOrder | Success | 2023 2 |psOrder | Failed | 2023 3 |saOrder | Failed | 2022 4 |skOrder | Failed | 2023 5 |pkOrder | NotRun | 2023 6 |plOrder | Success | 2023 7 |poOrder | Null | 2023
需要根据Status列的不同值统计各状态的数量,将统计结果作为单独列展示,同时计算这些统计列的总和,并按Year分组。期望结果格式如下:
Success | Failed | NotRun | Total | Year --------+--------+--------+-------+----- 2 | 3 | 1 | 6 | 2023 0 | 0 | 1 | 1 | 2022
尝试使用count()函数无法将Status的行值转为列,寻求实现方法。
实现方法
在SQL Server中,你可以通过条件聚合实现行转列的统计需求,具体有两种常用写法:
写法一:使用SUM+CASE
SELECT SUM(CASE WHEN Status = 'Success' THEN 1 ELSE 0 END) AS Success, SUM(CASE WHEN Status = 'Failed' THEN 1 ELSE 0 END) AS Failed, SUM(CASE WHEN Status = 'NotRun' THEN 1 ELSE 0 END) AS NotRun, -- 排除Status为Null的记录,匹配期望结果的Total统计 SUM(CASE WHEN Status IS NOT NULL AND Status != 'Null' THEN 1 ELSE 0 END) AS Total, Year FROM Orders GROUP BY Year ORDER BY Year DESC;
写法二:使用COUNT+CASE
SELECT COUNT(CASE WHEN Status = 'Success' THEN 1 END) AS Success, COUNT(CASE WHEN Status = 'Failed' THEN 1 END) AS Failed, COUNT(CASE WHEN Status = 'NotRun' THEN 1 END) AS NotRun, COUNT(CASE WHEN Status IS NOT NULL AND Status != 'Null' THEN 1 END) AS Total, Year FROM Orders GROUP BY Year ORDER BY Year DESC;
说明
- 两种写法核心都是通过
CASE表达式对Status进行条件判断,配合聚合函数实现分组统计:SUM写法中,匹配状态返回1,不匹配返回0,求和后得到对应状态的数量;COUNT写法利用COUNT忽略Null值的特性,匹配状态返回1,不匹配返回Null,最终统计非Null的数量。
Total列排除了Status为Null的记录,和你给出的期望结果一致;如果需要统计所有行(包括Null状态),直接用COUNT(*)即可。- 最后通过
GROUP BY Year按年份分组,ORDER BY Year DESC可根据需求调整排序方向。
内容的提问来源于stack exchange,提问作者SuryaKavitha
相关产品推荐
相关产品推荐

