2014-10-01 2 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

Смежные вопросы