2013-02-11 525 views

回答

0

依我看bluefeet的答案可能是你真正需要的,因爲它聽起來像你只是想計數非零;但是這將讓你的零和非零項的數量如果不是這種情況:

SELECT 
    ROUND(SUM(CASE NVL(dmd_1wk, 0) = 0 THEN 1 ELSE 0 END), 2) AS "Zeros", 
    ROUND(SUM(CASE NVL(dmd_1wk, 0) != 0 THEN 1 ELSE 0 END), 2) AS "NonZeros" 
FROM table 

雖然在四捨五入整數沒有意義的,我已經包括了原來的回合,我猜因爲這是用來格式化數字的預期功能

TO_CHAR(SUM(...), '999.00') 

:你使用它格式化,但是您可能需要使用。

1

方法1:案例聲明。如果需要繼續處理所有行(where子句將阻止),這可能很有用。

SELECT count(case when dmd_1wk = 0 then 0 else 1 end) as NonZeroCount FROM MyTable 

方法2:WHERE子句。

SELECT 
    count(1) as NonZeroCount 
FROM 
    MyTable 
WHERE 
    dmd_1wk <> 0 
+0

:它仍然給出相同的結果 – Satheesh 2013-02-11 14:37:40

+0

這是正確的。 where子句將處理更少的行。 case語句方法將處理所有行。根據您的其他應用程序需求,這兩個選項都可能有用 – 2013-02-11 14:39:36

5

這聽起來像你只需要添加一個WHERE條款:如果你想同時非零和零個值的計數

SELECT 
     round(COUNT(dmd_1wk),2) AS NBR_ITEMS_1WK 
FROM table 
WHERE dmd_1wk <> 0; 

,那麼你可以使用類似:

SELECT 
    round(COUNT(case when dmd_1wk <> 0 then dmd_1wk end),2) AS NBR_ITEMS_1WK_NonZero, 
    round(COUNT(case when dmd_1wk = 0 then dmd_1wk end),2) AS NBR_ITEMS_1WK_Zero 
FROM table; 
0

您可以過濾它們。

SELECT round(COUNT(dmd_1wk),2) AS NBR_ITEMS_1WK 
FROM table 
WHERE dmd_1wk <> 0; 
1

我想提供使用NULLIF因爲COUNT將不計算NULL值的另一種解決方案:

SELECT round(COUNT(NULLIF(dmd_1wk,0)),2) AS NBR_ITEMS_1WK 
FROM table; 

這裏是Fiddle

祝你好運。