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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:02:59