2014-10-01 81 views
0

我從我們的Oracle數據庫中提取統計數據。此查詢...劃分兩個複雜列(Oracle)

select 
    substr(cm.course_name,0,INSTR(cm.course_name,'.',1,1) - 1) as "SUBJECT", 
     count(*) as "TOTAL SHELLS",  
     count(case when (cs.size_total = 0 or cm.pk1 not in (select crsmain_pk1 from course_size)) 
      and not exists (select 1 from course_contents where crsmain_pk1 = cm.pk1) 
     then 1 else null end) as "EMPTY SHELLS",  
    from course_main cm 
    left join course_size cs on cm.pk1 = cs.crsmain_pk1 
    where cm.row_status = 0 
    and cm.data_src_pk1 in (select pk1 from data_source where batch_uid like ('%2014FA')) 
    group by substr(cm.course_name,0,INSTR(cm.course_name,'.',1,1) - 1); 

...產生這樣的結果:

--SUBJECT, TOTAL SHELLS, EMPTY SHELLS 
--DHY, 40, 19 
--HSC, 10, 0 
--BIO, 79, 7 

雖然這個結果是可用的,我想有最後兩列之間計算的百分比,所以我有結果是這樣的:

--SUBJECT, TOTAL SHELLS, EMPTY SHELLS, % EMPTY 
--DHY, 40, 19, 48% 
--HSC, 10, 0, 0% 
--BIO, 79, 7, 9% 

這樣做AFAIK的唯一方法是複製每個count語句並把它們作爲分子和分母,但是這意味着不必要重新計算兩個值我們已經有了 - 更不用說使查詢笨重而難以閱讀。有沒有更好的辦法?

回答

2

只需使用您的查詢作爲子查詢來避免重新計算全部。

SELECT 
subject as "SUBJECT", 
totalshells as "TOTAL SHELLS", 
emptyshells as "EMPTY SHELLS", 
ROUND((emptyshells/totalshells) * 100) as "% EMPTY" 
from 
(select 
    substr(cm.course_name,0,INSTR(cm.course_name,'.',1,1) - 1) as subject, 
     count(*) as totalshells,  
     count(case when (cs.size_total = 0 or cm.pk1 not in (select crsmain_pk1 from course_size)) 
      and not exists (select 1 from course_contents where crsmain_pk1 = cm.pk1) 
     then 1 else null end) as emptyshells,  
    from course_main cm 
    left join course_size cs on cm.pk1 = cs.crsmain_pk1 
    where cm.row_status = 0 
    and cm.data_src_pk1 in (select pk1 from data_source where batch_uid like ('%2014FA')) 
    group by substr(cm.course_name,0,INSTR(cm.course_name,'.',1,1) - 1)) s 
+0

我知道那裏是一個更好的解決方案。謝謝! – Cliff 2014-10-01 15:08:51