2011-07-07 101 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');