2014-10-09 38 views
0

我想使用窗口函數在同一行上顯示總計(工作人員流動率)和結果,但是我無法使其工作。它在total_labour_turnover列的over子句中爲我提供了「來自關鍵字未找到的地方」。Oracle sql窗口函數 - 與結果總共在同一行

基本上我想要顯示總勞動力週轉量以及各行的勞動力週轉量。請注意,我不想要一個總計。

任何人都知道如何做到這一點?

select active.cost_centre, 
     active.flexi_perm, 
     active.active_count, 
     nvl(term.term_count, 0) term_count, 
     round(nvl(term.term_count, 0)/active.active_count * 100, 2) labour_turnover, 
     round(sum(nvl(term.term_count, 0))/sum(active.active_count) * 100, 2) over (order by 1) total_labour_turnover 
from (  
      select haou.name cost_centre, 
       decode(payr.attribute2, 'F', 'Flexi', 'Perm') flexi_perm, 
       count(paaf.assignment_id) active_count 
      from per_periods_of_service  ppos, 
       per_all_assignments_f  paaf, 
       hr_organization_information hoi, 
       hr_all_organization_units haou, 
       pay_all_payrolls_f   payr 
      where trunc(:active_count_date) between ppos.date_start and nvl(ppos.actual_termination_date, to_date('31/12/4712', 'dd/mm/yyyy')) 
      and paaf.period_of_service_id = ppos.period_of_service_id 
      and paaf.primary_flag = 'Y' 
      and trunc(:active_count_date) between paaf.effective_start_date and paaf.effective_end_date 
      and hoi.org_information_context = 'TRU_ADD_ORG' 
      and hoi.organization_id = paaf.organization_id 
      and haou.organization_id = paaf.organization_id 
      and payr.payroll_id = paaf.payroll_id 
      and payr.attribute2 in ('F', 'N') -- Flexi and Non-Flexi 
      and trunc(:active_count_date) between payr.effective_start_date and payr.effective_end_date   
      group by haou.name, 
       decode(payr.attribute2, 'F', 'Flexi', 'Perm') 
     ) active, 
     (    
      select haou.name cost_centre, 
       decode(payr.attribute2, 'F', 'Flexi', 'Perm') flexi_perm, 
       count(distinct paaf.person_id) term_count 
      from per_periods_of_service ppos, 
       per_all_assignments_f  paaf, 
       hr_organization_information hoi, 
       hr_all_organization_units haou, 
       pay_all_payrolls_f   payr   
      where nvl(ppos.actual_termination_date, to_date('31/12/4712', 'dd/mm/yyyy')) between trunc(:term_start) and trunc(:term_end) 
      and paaf.period_of_service_id = ppos.period_of_service_id 
      and paaf.primary_flag = 'Y' 
      and nvl(ppos.actual_termination_date, to_date('31/12/4712', 'dd/mm/yyyy')) between paaf.effective_start_date and paaf.effective_end_date 
      and hoi.org_information_context = 'TRU_ADD_ORG' 
      and hoi.organization_id = paaf.organization_id 
      and haou.organization_id = paaf.organization_id 
      and payr.payroll_id = paaf.payroll_id 
      and payr.attribute2 in ('F', 'N') -- Flexi and Non-Flexi 
      and nvl(ppos.actual_termination_date, to_date('31/12/4712', 'dd/mm/yyyy')) between payr.effective_start_date and payr.effective_end_date   
      group by haou.name, 
       decode(payr.attribute2, 'F', 'Flexi', 'Perm')     
     ) term 
where term.cost_centre (+) = active.cost_centre 
and term.flexi_perm (+) = active.flexi_perm 

回答

1

請嘗試以下操作,它應該幫助:

round(sum(nvl(term.term_count, 0)) over()/sum(active.active_count) over() * 100, 2) total_labour_turnover 

你在你的表達有兩個SUM函數均需要是一個解析函數。

0

據對解析函數Oracle文檔,所述order by子句自動意味着rows between unbounded preceding and current row運行窗口。

如果你不希望運行總和,而是一個整體的總和,刪除你的分析sum()功能的over子句order by 1,把一個partition by null有代替。或者用空的括號嘗試,也可能工作。