PL / SQL代码,用于在一个季度内获取每个月的员工人数

时间:2013-09-03 16:25:10

标签: sql plsql oracle11g plsqldeveloper

我有一个表per_all_peopl_f,其中包含以下列:

name  person_id  emp_flag  effective_start_date   effective_end_date   DOJ
--------------------------------------------------------------------------------    
ABC   123          Y       30-MAR-2011              30-MAR-2013       10-FEB-2011
ABC   123          Y       24-FEB-2011              27-FEB-2011       10-FEB-2011
DEF   345          N       10-APR-2012              30-DEC-4712       15-SEP-2011

有许多条目(1000+)包含重复数据和不同的有效开始日期。

我必须计算劳动力人数。也就是说,每季度退出公司的员工人数。

必须提取以下列:

Headcount in 2012 (1st quarter)
Headcount in 2013 (1st quarter)
difference between the two headcounts
% difference

问题是我使用的查询只给了1个季度的人数。 我希望员工人数在1个季度内每个月计算一次。那是jan,feb,mar seperate - > Q1。 4月,5月,6月 - > q2分开。

示例: - 如果我将p_quarter作为Q1传递。

输出应计算1月,2月,3月,4月的人数。全部4个单独

我没有考虑如何包含anothr for循环和相同的函数来获取此日期。

我过去常常查找人数的查询是:

CREATE OR REPLACE FUNCTION function_name
      (l_end_date ,l_start_date  ) 
      RETURN number;
      IS 
        l_emp

      BEGIN
        select count(distinct papf.person_id)
          into l_emp
          from per_all_people_f papf
         where papf.emp_flag ='Y'
           and effective_start_date >=l_end_date
           and effective_end_date <=l_start_date ;

        return l_emp; 
    END function_name;


    create xx_pack_name  body
    is 
    crate or replace procedure proc_name( l_quarter number,
                          p_person_id number,
                          l_quarter number )
        cursor cur_var
        is 
           select function_name(l_start_date ,l_end_date ) EMP_2012,
                  function_name(l_start_date1,l_end_date1 ) EMP_2013,
                  function_name(l_start_date ,l_end_date )-function_name(l_start_date1,l_end_date1 ) Diff
             from dual;


    Begin


    if l_quarter =1
    then
    l_start_date1 :='01-Jan-2013';
    l_end_dat1e :='31-APR-2013';
 l_start_date :='01-Jan-2012';
    l_end_date :='31-APR-2012';

    elsif l_quarter =2
    then
    l_start_date :='01-May-2012';
    l_end_date :='31-Aug-2012';
 l_start_date1 :='01-May-2013';
    l_end_date1 :='31-Aug-2013';


    else
    l_start_date1 :='01-Sep-2013';
    l_end_date1 :='31-Dec-2013';




    end if;

    for cur_val in cur_var 
    loop
    dbms_output.put_line(cur_var.emp_2012 || cur_var.emp_2013 ||cur_var.diff )

    end loop



    end xx_pack_name  ;

0 个答案:

没有答案