我有一个表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 ;