【问题标题】:count and sum in case statement案例陈述中的计数和总和
【发布时间】:2021-06-06 06:16:52
【问题描述】:

如果我使用 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

谢谢!

【问题讨论】:

  • Count 计数 1 和 0
  • 但在我上面的示例中,END 或 ELSE NULL 是否使案例仅将指定值计为 1?
  • 两个计数查询都会引发“在集合函数中消除空值”警告。

标签: mysql sql presto trino


【解决方案1】:

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

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 中实现,但会在未来某个时候添加。

【讨论】:

    【解决方案2】:

    这三个是等价的。它们都计算满足特定条件(salary > 100000)的行数。全部返回 0/1 并且不会返回 NULL 列的值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多