2011-07-07 72 views

回答

9

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

SELECT SUM(CASE WHEN p.end_dt IS NULL THEN 1 ELSE 0 END)/COUNT(*) * 100 
    FROM PACKAGES p 
+1

返回“100” .. –

+3

@OMG:我认为你需要SUM,而不是COUNT,并且翻转1&0(或者说不为空) – Gerrat

+0

嗨Gerrat,yep,SUM是正确的,但是1&0是正确的。谢谢! –

6

因此,基本公式是现在

COUNT(NULL-valued "end_dt")/COUNT(*) * 100 

COUNT(NULL-valued "end_dt")在语法上是错误的,但它可以表示为COUNT(*) - COUNT(end_dt)。因此,该公式是这样的:

(COUNT(*) - COUNT(end_dt))/COUNT(*) * 100 

如果我们只是把它简化一下,我们会得到:

SELECT (1 - COUNT(end_dt) * 1.0/COUNT(*)) * 100 AS Percent 
FROM packages 

* 1.0COUNT整数结果转换成非整数值,所以也使分区非整数。

以上句子和脚本的相应部分竟然是完全垃圾。与其他数据库服务器不同,即使两个操作数都是整数,Oracle也不会执行整数除法。 This doc page不包含除法运算符的这种行为的暗示。

+1

+1,但...需要转换'a/b'才能使用非整数类型? (不言而喻或明确) – MatBailie

+0

@Dems:你可能是对的。我确信SQL Server肯定会需要它。那么我会修改我的答案。 –

+0

+1洞察Andriy。 –

3

原帖是在牙齿有点长,但这应该工作,使用功能“RATIO_TO_REPORT”这一直是可用的,因为甲骨文8i中:

SELECT 
    NVL2(END_DT, 'NOT NULL', 'NULL') END_DT, 
    RATIO_TO_REPORT(COUNT(*)) OVER() AS PCT_TOTAL 
FROM 
    PACKAGES 
GROUP BY 
    NVL2(END_DT, 'NOT NULL', 'NULL');