case 语句中的计数和求和

count and sum in case statement

如果我使用 case 而不是 sum,下面有什么区别?我相信我会得到相同的输出?

SELECT SUM(CASE WHEN salary > 100000 THEN 1 ELSE 0 END) AS Total

SELECT COUNT(CASE WHEN salary > 100000 THEN 1 END) AS Total

SELECT COUNT(CASE WHEN salary > 100000 THEN 1 ELSE NULL END) AS Total

谢谢!

三者是等价的。它们都计算满足特定条件 (salary > 100000) 的行数。所有 return 0/1 并且不会 return NULL 列的值。

从性能的角度来看,所有这些也应该是等效的。我对第一个版本有个人偏好。我认为第三个不必要地冗长,因为 else NULLcase 表达式的默认值。

根据其他答案,所有形式都是等效的。还有一些其他形式更紧凑并达到相同的结果:

count_if(salary > 100000)

count(if(salary > 100000, 1))

但是,在 Trino (formerly known as Presto SQL) 中执行此操作的惯用且更通用的方法是:

SELECT count(*) FILTER (WHERE salary > 100000) AS Total
FROM ...

有关筛选聚合的更多详细信息,请参阅 documentation

根据 SQL 规范,除基于 SUM 的表格外,所有其他表格都应发出警告以指示空值已被消除。此行为尚未在 Trino 中实现,但会在将来的某个时候添加。