根据 SQL Server 中的条件计数

Posted

技术标签:

【中文标题】根据 SQL Server 中的条件计数【英文标题】:Count based on condition in SQL Server 【发布时间】:2010-08-11 04:06:38 【问题描述】:

有谁知道如何根据条件在 SQL Server 中进行计数。

例子:

如何对名为“system”的记录以及表中的总 CaseID 记录进行列计数?

客户表

UserID     CaseID     Name
1          100        alan
1          101        alan
1          102        amy
1          103        system
1          104        ken
1          105        ken
1          106        system  

结果如下所示:

UserID    TotalCaseID    TotalRecordsWithSystem
1         7              2

【问题讨论】:

为什么不应该使用WHERE name = 'system' 【参考方案1】:

使用 SUM/CASE...

SELECT
    COUNT(*),  --total
    SUM(CASE WHEN name = 'system' THEN 1 ELSE 0 END) --conditional
FROM
    myTable

【讨论】:

哦,旧的好 SUM CASE... 总是那么有帮助,总是那么容易忘记。谢谢! ELSE 0 END 对我不起作用。根据@kage 的回答,我必须使用ELSE null END @SebastianJ。可能是因为您在 CASE WHEN .. THEN .. ELSE .. END 构造中使用了 COUNT()。如果你使用SUM() 如图所示,它会工作得很好。 SELECT COUNT(*) FROM myTable WHERE name='system' 也可以,不需要CASE WHEN【参考方案2】:

我认为他希望结果中包含用户 ID

SELECT 
    userid,
    COUNT(*) as TotalcaseID, --total 
    SUM(CASE WHEN name = 'system' THEN 1 ELSE 0 END) as TotalRecordsWithSystem  
FROM 
    myTable 
group by userid

【讨论】:

【参考方案3】:
select
userid,
count('x') as TotalCaseID,
count(case when name = 'system' then 'x' else null end) as TotalRecordsWithSystem
from CustomerTable
group by userid

【讨论】:

【参考方案4】:

如果您使用的是 SQL Server 2012+,那么您可以使用 SUM/IIF

SELECT
    COUNT(*) AS Total,
    SUM(IIF(Name = 'system', 1, 0)) AS SystemTotal
FROM
    CustomerTable

【讨论】:

以上是关于根据 SQL Server 中的条件计数的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法根据 Hive/SQL 中的条件初始化计数器?

如何推断 SQL Server 中的日期以计算每日计数?

Sql-Server触发器,根据条件匹配另一个表中的字段

从另一个表中逐行计数,在sql中的两个表上保存一些条件

sql server更新查询中的if条件

如何根据多个条件从 SQL Server 中删除大量数据