如何使用任何Oracle函数选择计数作为Oracle总数的百分比?

Oh *_*oon 3 sql oracle aggregate-functions

我有一个SQL语句,它计算结束日期为null的活动包的总行数.我目前正在使用(x/y) * 100:

SELECT (SELECT COUNT(*) 
          FROM packages 
         WHERE end_dt IS NULL) / (SELECT COUNT(*) 
                                    FROM packages) * 100 
  FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法利用任何Oracle函数来更容易地表达这一点?

OMG*_*ies 9

没有我知道的功能,但你可以简单地查询:

SELECT SUM(CASE WHEN p.end_dt IS NULL THEN 1 ELSE 0 END) / COUNT(*) * 100
  FROM PACKAGES p
Run Code Online (Sandbox Code Playgroud)

  • @OMG:我认为你想要SUM,而不是COUNT,然后翻转1&0(或者说不是null) (3认同)
  • @OMG小马:你是对的,但聚合对待NULL有点不同:他们只是忽略它们.无论如何,我的意思是使用`ELSE NULL`和COUNT,而不是SUM.满足条件时,CASE将返回一个值,否则返回NULL.因此,COUNT仅计算满足条件时的发生次数. (2认同)

And*_*y M 6

所以,基本上这个公式是

COUNT(NULL-valued "end_dt") / COUNT(*) * 100
Run Code Online (Sandbox Code Playgroud)

现在,COUNT(NULL-valued "end_dt")语法错误,但它可以表示为COUNT(*) - COUNT(end_dt).所以,公式可以是这样的:

(COUNT(*) - COUNT(end_dt)) / COUNT(*) * 100
Run Code Online (Sandbox Code Playgroud)

如果我们稍微简化它,我们会得到这个:

SELECT (1 - COUNT(end_dt) * 1.0 / COUNT(*)) * 100 AS Percent
FROM packages
Run Code Online (Sandbox Code Playgroud)

* 1.0位将整数结果转换COUNT为非整数值,因此也使除法非整数.

上面的句子和脚本的相应部分原来是完全垃圾.与其他一些数据库服务器不同,即使两个操作数都是整数,Oracle也不会执行整数除法.此doc页面不包含除法运算符的此类行为的提示.