я одну таблицы, per_all_peopl_f
, со следующими столбцами:PL/SQL (Как рассчитать первый и последний день любого квартала любого года)
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 ;
Этот пакет занимает слишком много времени.
Есть ли другой способ рассчитать последний и первый день квартала любого года ????
А также, когда я расчет
процент function_name (l_start_date, l_end_date ) -function_name (l_start_date1, l_end_date1)/100
выход не приходит в отборном заявлении
Разницы между численностью в одну четверти, и что в следующем не то же самое, как количество людей, которые ушли. –
Да ... вот почему разница havet o быть calculatd –
Вы, кажется, определяете квартальную численность как «общее число уникальных людей, которые были заняты в любое время в течение квартала». Или что-то. Ваш код "effective_start_date> = l_end_date и effective_end_date <= l_start_date" ... правильно ли эта логика? Похоже, он никогда не вернет результат. –