2013-10-30 82 views
1

我有一個表mytable具有以下結構和數據(的Oracle 11g)如何獲得非零值的數量,同時計算平均

Job_name job_execution_time(JET in seconds) Run_Date   records_processed 
A1    0         7/1/2013   0 
A1    0         7/5/2013   0 
A1    3         7/12/2013   5 
A1    9         7/22/2013   14 
A1    0         8/1/2013   0 
A1   15         8/16/2013   20 
A2    0         8/15/2013   0  
A2    0         8/17/2013   0 
A2   10         9/15/2013   25 
A2   45         9/17/2013   70 

我試圖獲得平均(忽略「0」值) (JET)列的每個工作的具體月份。此外,我需要計算我用於平均計算的非零值。 例如:
對於July月份的工作A1,JET列的平均值將爲(9+3)/2 = 6,並且用於計算此平均值的非零值的計數爲2
我使用下面的代碼得到了平均值,但有問題得到計數。

select job_name , to_char(Run_Date, 'Month') Mon , 
     nvl(avg(nullif(job_execution_time,0)), 0) Average_secs 
from mytable 
group by job_name, to_char(Run_Date, 'Month') 

如何獲得用於計算每個平均值的非零值的計數?我嘗試了以下計數,但不起作用。

  • count(nullif(job_execution_time, 0)) count_nonzeros
  • sum(CASE nvl(job_execution_time, 0) !=0 THEN 1 ELSE 0 END) AS "Count_NonZeros"

感謝。

+0

你的總和應該工作,但是我覺得語法缺少一個WHEN:SUM(CASE WHEN NVL(job_execution_time,0)= 0,則1 ELSE 0 END ) –

+0

感謝您指出缺少'何時'。我添加了它,但它只給出了它在網格中顯示的第一個作業的正確計數。其他後續作業的計數值不正確。 – bluerose

+0

如果可能,請在您的問題中用'sum'語法添加您的最終查詢。 –

回答

0

您可以使用SUM和CASE語句

select job_name , to_char(Run_Date, 'Month') Mon , 
     nvl(avg(nullif(job_execution_time,0)), 0) Average_secs, 
     sum(case when job_execution_time !=0 then 1 else 0 end) counts 
     from table1 group by job_name, to_char(Run_Date, 'Month');