0

per_all_peopl_f次の列を持つ 1 つのテーブルがあります。

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 以上) があります。

従業員の人数を計算する必要があります。つまり、四半期ごとに会社を辞める従業員の数です。

次の列をフェッチする必要があります。

  • 2012 年 (第 1 四半期) の人員数
  • 2013 年 (第 1 四半期) の人員数
  • 2 つの人数の違い
  • % 違い

これは四半期ごとに行う必要があります。それは私が合格した四半期であり、それに基づいて従業員数を計算する必要があります。

私が書いたクエリは

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_year 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_year=2012)

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

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

else
l_start_date :='01-Sep-2013';
l_end_date :='31-Dec-2013';

end if;
end if;
if(l_year=2013)

then 

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

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

else
l_start_date :='01-Sep-2013';
l_end_date :='31-Dec-2013';

end if;
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  ;

このパッケージには時間がかかりすぎています。

任意の年の四半期の最終日と初日を計算できる他の方法はありますか????

また、私が計算しているとき

パーセンテージ function_name(l_start_date ,l_end_date )-function_name(l_start_date1,l_end_date1 ) /100

出力が select ステートメントに入っていない

4

1 に答える 1