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 NULL
是 case
表达式的默认值。
根据其他答案,所有形式都是等效的。还有一些其他形式更紧凑并达到相同的结果:
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 中实现,但会在将来的某个时候添加。
如果我使用 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 NULL
是 case
表达式的默认值。
根据其他答案,所有形式都是等效的。还有一些其他形式更紧凑并达到相同的结果:
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 中实现,但会在将来的某个时候添加。