Sql server 如何计算SQL Server中具有特定值的行数?

Sql server 如何计算SQL Server中具有特定值的行数?,sql-server,Sql Server,我有如下格式化的表格行。我需要根据状态计算行数 例如: 输出: Sno Operation CountStatus ---------------------------- 1 OP10 2 2 OP10 3 3 OP20 3 4 OP30 0 我需要计算状态是否为“完成”和“正在进行”。如果状态为“就绪”,则表示需要显示计数为“0”。使用条件聚合: 创建并填充示例表请

我有如下格式化的表格行。我需要根据状态计算行数

例如:

输出:

Sno  Operation   CountStatus
----------------------------
1     OP10            2
2     OP10            3
3     OP20            3
4     OP30            0

我需要计算状态是否为“完成”和“正在进行”。如果状态为“就绪”,则表示需要显示计数为“0”。

使用条件聚合:

创建并填充示例表请在以后的问题中保存此步骤

Declare @T as table
(
    Sno int,
    Operation char(4),
    Status varchar(10)
)

INSERT INTO @T VALUES
(1, 'OP10', 'Complete'),
(1, 'OP10', 'Complete'),
(2, 'OP10', 'Complete'),
(2, 'OP10', 'Complete'),
(2, 'OP10', 'Complete'),
(3, 'OP20', 'InProgress'),
(3, 'OP20', 'InProgress'),
(3, 'OP20', 'InProgress'),
(4, 'OP30', 'Ready'),
(4, 'OP30', 'Ready')
查询:

SELECT Sno, 
       Operation, 
       SUM(CASE WHEN Status IN('Complete', 'Inprogress') THEN 1 ELSE 0 END) As CountStatus
FROM @T
GROUP BY Sno, Operation
ORDER BY Sno
结果:

Sno Operation   CountStatus
1   OP10        2
2   OP10        3
3   OP20        3
4   OP30        0

就性能而言,这会更好

Select t.sno,t.operation, tt.cno
from (select distinct t.sno, t.operation from tablename t) t 
inner join (select t.sno, 
cno = count(case when Status in ('Complete', 'InProgress') then 1 else null end)  
                    from tablename group by sno)tt on t.sno = tt.sno

我使用了简单的案例陈述

SELECT
        SNO,Operation,SUM(CASE Status WHEN 'Complete' THEN 1 
                                  WHEN 'InProgress' THEN 1
                                  WHEN 'Ready' THEN 0 END) AS Cnt_Status
FROM Your_table
GROUP BY SNO,Operation
请尝试此查询

从表1中选择SNo、操作、计数SNo
按sno分组,操作

是否尝试使用case语句的聚合函数?是否不希望OP10显示CountStatus为5?或者您想在结果中包含状态描述吗?我想为Sno 1显示OP10 2,为sno2显示OP10 3。我不想在第五节上展示《凤凰社》第十章。因为Sno是不同的。它可以工作,但我想为Sno 1显示OP10 2,为sno2显示OP10 3。我不想在第五节上展示《凤凰社》第十章。因为Sno是不同的。
SELECT
        SNO,Operation,SUM(CASE Status WHEN 'Complete' THEN 1 
                                  WHEN 'InProgress' THEN 1
                                  WHEN 'Ready' THEN 0 END) AS Cnt_Status
FROM Your_table
GROUP BY SNO,Operation