【发布时间】:2013-08-31 14:51:46
【问题描述】:
我有一张桌子,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+) 具有重复的数据和不同的生效开始日期。
我必须计算员工人数。即每季度退出公司的员工人数。
必须提取以下列:
- 2012 年员工人数(第一季度)
- 2013 年员工人数(第一季度)
- 两个员工人数的差异
- % 差异
这必须每季度进行一次。也就是说,无论我通过哪个季度,劳动力人数都应该按照这个计算。
我写的查询是
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 ;
这个包太长了。
有没有其他方法可以计算任何一年季度的最后一天和第一天????
当我计算时
百分比函数名(l_start_date ,l_end_date )-function_name(l_start_date1,l_end_date1) /100
选择语句中没有输出
【问题讨论】:
-
上一季度的人数与下一季度的人数之差与离开的人数不一样。
-
是的...这就是为什么必须计算差异
-
您似乎将季度员工人数定义为“在本季度任何时候受雇的唯一人员总数”。或者其他的东西。您的代码“effective_start_date >=l_end_date 和 effective_end_date
-
查看有效日期是对特定员工在表中进行任何更改的日期。我通过函数得到结果。有没有更好的方法来计算任何季度的最后一天和第一天
标签: sql oracle plsql oracle-sqldeveloper plsqldeveloper