【问题标题】:Aggregate to count values equal to a constant聚合以计数等于常数的值
【发布时间】:2013-10-14 12:02:30
【问题描述】:

在 SQL 中,有一种表达方式可以计算有多少值与 'x' 不同:

SELECT COUNT(NULLIF(col, 'x')) FROM table

我发现计算等于 'x' 的值不太优雅:

  • SELECT COUNT(*) - COUNT(NULLIF(col, 'x')) FROM table
  • SELECT SUM(CASE WHEN col = 'x' THEN 1 ELSE 0 END) FROM table
  • [oracle] SELECT COUNT(DECODE(col,'x','x',NULL)) FROM table

有没有更优雅的方式来做到这一点?

【问题讨论】:

  • 为什么不select count(*) from table where col = 'x'
  • @Roman:你说得对,这个问题似乎很愚蠢。但在这里,我需要在单个查询中执行多个计数:select count_if(col, 'x'), count_if(col, 'y'), count_if(col, 'z') FROM table
  • @Roman select count(*) from table where col <> 'x' 不计算 col 为空的行。
  • @KlasLindbäck 它很容易调整,可能是 OP 不需要计算空值。无论如何,OP说他想做不止一个查询,我认为最易读的查询是使用sum(case ... )
  • 使用in 运算符过滤结果集where col in ('x','y','z')。然后你可以使用count聚合函数结合case表达式来计算每个值的个数,或者pivot运算符。

标签: sql oracle count aggregate-functions


【解决方案1】:
 SELECT 
     COUNT(CASE WHEN col='x' THEN 1 END) AS XCount, 
     COUNT(CASE WHEN col='y' THEN 1 END) AS YCount,
     COUNT(CASE WHEN col='z' THEN 1 END) AS ZCount
  FROM table

【讨论】:

    【解决方案2】:

    品味是一个很私人的东西,我喜欢在Oracle中使用这种语法:

    select sum(decode(text,'x',0,1))
    from table
    

    【讨论】:

      【解决方案3】:

      直接的方法是在WHERE 子句中进行过滤:

      SELECT COUNT(*) FROM table WHERE col = 'x'
      

      编辑:

      如果您不能使用 where 子句(因为您在同一个 SELECT 中执行多个计数),那么我认为您建议自己的方式是最优雅的方式。 我个人的偏好是SUM(CASE WHEN...

      【讨论】:

      • 完美地回答了这个问题……但请参阅对问题的评论,我需要在同一个查询中计算多个。
      猜你喜欢
      • 2017-01-28
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2022-11-04
      相关资源
      最近更新 更多