使用 Null 进行 SQL 计数

Posted

技术标签:

【中文标题】使用 Null 进行 SQL 计数【英文标题】:TSQL Counting with Nulls 【发布时间】:2018-06-23 00:22:40 【问题描述】:

我有一张表格,计算急诊科的入院和出院情况。这就是表格的样子

我正在尝试获取入院和出院的总数。像

录取 - 100 放电 - 200

有没有办法用 NULL 值做到这一点?

【问题讨论】:

这些值是否总是NULL1 【参考方案1】:
select 
    sum(case when Admitted is null then 0 else Admitted end) Admitted,    
    sum(case when DischargedFromED is null then 0 else DischargedFromED end) as DischargedFromED
from MyMagicalTable;

select
    sum(coalesce(Admitted, 0)) Admitted,
    sum(coalesce(DischargedFromED, 0)) DischargedFromED
from MyMagicalTable;

【讨论】:

【参考方案2】:

只需使用sum()

select sum(admitted) as admitted, sum(DischargedFromED) as DischargedFromED
from t;

聚合函数忽略 NULL 值。

如果您担心NULL 值出现在sum() 之后,那么在之后使用coalesce()

select coalesce(sum(admitted), 0) as admitted,
       coalesce(sum(DischargedFromED), 0) as DischargedFromED
from t;

以上假设列是数字的。如果它们是其他类型,则需要将它们转换为数字。

【讨论】:

COUNT(Admitted)COUNT(DischargedFromED) 也可以工作,因为 COUNT(<expression>) 只计算非空值。 只有在知道至少有一个数字结果的情况下,使用 SUM 忽略 null 才是安全的。否则,SUM 返回 null,而不是 0,我认为这是他在特定用例中想要的。也可以将整个 SUM 包装在一个合并中。不管怎样,都应该处理。计数可能有效,但我不能 100% 确定他的列是 BIT 而不是 INT @Josh 。 . . OPs 样本数据在两列中都有值,因此这实际上不是样本数据的问题。至于类型,第一句话说“我有一张桌子很重要”。 Bit 通常不被称为“计数”。但是,无论如何,这些通常都是合理的观点,所以我在答案中进行了详细说明。

以上是关于使用 Null 进行 SQL 计数的主要内容,如果未能解决你的问题,请参考以下文章

如何添加计数以对 SQL Hive 中的空值进行排名?

SQL:Null 列的计数不正确

SQL 计数匹配

Oracle SQL - 如何使用 PIVOT 进行计数

使用一条 SQL 语句的结果在另一条语句中进行计数

Oracle SQL Developer - 计数函数