2017-05-06 40 views
-3

我有简单的表员工id,开始年份,结束年份。我必须找出有多少员工在最低年份工作。如果分年是2000年和最大。应该列出所有这些年份从2000年到2017年的工作雇员人数每年有多少员工工作?

+0

能否请您包括样本表或您的模式,以便我们不必猜测它看起来像什么? – Manngo

+0

那么你想要2000年的一行和那一年的员工数量,一年的2001年,当年的员工数量,等等?你有一个包含所有年份数字的表格吗? –

+0

[链接到示例表](https://drive.google.com/file/d/0B2z2BF4fbWh8aE1tMldQNG5CVDA/view?usp=sharing) – HankerPL

回答

0

这是一种方法,但我相信有其他更好的方式可以向我们展示。

with MA_MITARBEITER_TH (user_id, grp_type, sap_valid_from, sap_valid_to) as 
(
    select 107, 'NOT_ACTIVE', to_date('23-09-2011','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 107, 'NOT_ACTIVE', to_date('01-01-2012','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 107, 'NOT_ACTIVE', to_date('23-09-2011','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 107, 'ACTIVE', to_date('01-07-2007','dd-mm-yyyy'), to_date('31-08-2007','dd-mm-yyyy') from dual union all 
    select 107, 'ACTIVE', to_date('01-06-2007','dd-mm-yyyy'), to_date('30-06-2007','dd-mm-yyyy') from dual union all 
    select 107, 'NOT_ACTIVE', to_date('01-01-2012','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 107, 'ACTIVE', to_date('01-09-2007','dd-mm-yyyy'), to_date('31-12-2011','dd-mm-yyyy') from dual union all 
    select 107, 'ACTIVE', to_date('01-04-2006','dd-mm-yyyy'), to_date('31-05-2007','dd-mm-yyyy') from dual union all 
    select 107, 'ACTIVE', to_date('01-09-2007','dd-mm-yyyy'), to_date('22-09-2011','dd-mm-yyyy') from dual union all 
    select 106, 'NOT_ACTIVE', to_date('01-02-2007','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 106, 'NOT_ACTIVE', to_date('01-02-2007','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 106, 'ACTIVE', to_date('15-05-2006','dd-mm-yyyy'), to_date('31-01-2007','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-01-2013','dd-mm-yyyy'), to_date('31-05-2013','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('31-10-2013','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-06-2008','dd-mm-yyyy'), to_date('31-12-2008','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-01-2009','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-01-2014','dd-mm-yyyy'), to_date('01-12-2014','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-11-2016','dd-mm-yyyy'), to_date('31-12-2016','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('31-10-2016','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-03-2017','dd-mm-yyyy'), to_date('31-05-2017','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-01-2017','dd-mm-yyyy'), to_date('28-02-2017','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-06-2017','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('21-09-2006','dd-mm-yyyy'), to_date('31-05-2007','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-06-2008','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-01-2011','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-01-2011','dd-mm-yyyy'), to_date('31-12-2012','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-01-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-03-2010','dd-mm-yyyy'), to_date('31-12-2012','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-01-2012','dd-mm-yyyy'), to_date('31-12-2012','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-11-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-11-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-11-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-07-2009','dd-mm-yyyy'), to_date('31-07-2009','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-06-2007','dd-mm-yyyy'), to_date('31-05-2008','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-08-2009','dd-mm-yyyy'), to_date('28-02-2010','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('02-12-2014','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('02-12-2014','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('02-12-2014','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-11-2016','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('02-12-2014','dd-mm-yyyy'), to_date('31-10-2016','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-01-2017','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-01-2014','dd-mm-yyyy'), to_date('31-10-2016','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('01-01-2014','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 105, 'ACTIVE', to_date('01-03-2010','dd-mm-yyyy'), to_date('31-12-2012','dd-mm-yyyy') from dual union all 
    select 105, 'NOT_ACTIVE', to_date('02-12-2014','dd-mm-yyyy'), to_date('31-10-2016','dd-mm-yyyy') from dual union all 
    select 104, 'NOT_ACTIVE', to_date('01-09-2011','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 104, 'ACTIVE', to_date('01-01-2009','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 104, 'ACTIVE', to_date('01-06-2008','dd-mm-yyyy'), to_date('31-12-2008','dd-mm-yyyy') from dual union all 
    select 104, 'NOT_ACTIVE', to_date('01-09-2011','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 104, 'ACTIVE', to_date('01-10-2010','dd-mm-yyyy'), to_date('31-08-2011','dd-mm-yyyy') from dual union all 
    select 104, 'ACTIVE', to_date('01-07-2009','dd-mm-yyyy'), to_date('31-12-2009','dd-mm-yyyy') from dual union all 
    select 104, 'ACTIVE', to_date('01-06-2007','dd-mm-yyyy'), to_date('31-05-2008','dd-mm-yyyy') from dual union all 
    select 104, 'ACTIVE', to_date('01-01-2010','dd-mm-yyyy'), to_date('30-09-2010','dd-mm-yyyy') from dual union all 
    select 104, 'ACTIVE', to_date('01-06-2008','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 104, 'ACTIVE', to_date('10-04-2006','dd-mm-yyyy'), to_date('31-05-2007','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('20-08-2007','dd-mm-yyyy'), to_date('31-05-2008','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-08-2006','dd-mm-yyyy'), to_date('31-05-2007','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-06-2008','dd-mm-yyyy'), to_date('31-12-2008','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-06-2007','dd-mm-yyyy'), to_date('30-06-2007','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-08-2007','dd-mm-yyyy'), to_date('19-08-2007','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-01-2009','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-07-2007','dd-mm-yyyy'), to_date('31-07-2007','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-07-2009','dd-mm-yyyy'), to_date('31-05-2013','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('30-09-2013','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-11-2009','dd-mm-yyyy'), to_date('31-05-2013','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('31-12-2014','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-07-2009','dd-mm-yyyy'), to_date('31-10-2009','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-07-2007','dd-mm-yyyy'), to_date('19-08-2007','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('04-12-2013','dd-mm-yyyy'), to_date('31-12-2014','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('02-12-2016','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('01-01-2017','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'ACTIVE', to_date('03-12-2016','dd-mm-yyyy'), to_date('31-12-2016','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-01-2011','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-11-2009','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-01-2012','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-07-2009','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-07-2009','dd-mm-yyyy'), to_date('31-05-2013','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('30-09-2013','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('31-12-2014','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('01-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('02-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('03-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('02-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('04-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('03-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('05-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('04-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('06-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('05-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('06-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('07-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('07-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('08-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('09-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('08-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('09-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('10-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('11-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('10-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('12-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('11-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('13-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('12-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('14-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('13-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('15-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('14-01-2015','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-10-2013','dd-mm-yyyy'), to_date('31-12-2014','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('03-12-2016','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('02-12-2016','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('03-12-2016','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 100, 'NOT_ACTIVE', to_date('04-12-2013','dd-mm-yyyy'), to_date('02-12-2016','dd-mm-yyyy') from dual union all 
    select 103, 'NOT_ACTIVE', to_date('01-12-2007','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 103, 'ACTIVE', to_date('23-05-2006','dd-mm-yyyy'), to_date('31-05-2007','dd-mm-yyyy') from dual union all 
    select 103, 'ACTIVE', to_date('01-06-2007','dd-mm-yyyy'), to_date('30-11-2007','dd-mm-yyyy') from dual union all 
    select 103, 'NOT_ACTIVE', to_date('01-12-2007','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-12-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-12-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-12-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-12-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-08-2011','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-01-2012','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-08-2011','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-08-2011','dd-mm-yyyy'), to_date('31-05-2013','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-06-2013','dd-mm-yyyy'), to_date('30-11-2013','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('02-11-2008','dd-mm-yyyy'), to_date('31-12-2008','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-01-2009','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-11-2008','dd-mm-yyyy'), to_date('31-12-2008','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-01-2015','dd-mm-yyyy'), to_date('13-12-2016','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('14-12-2016','dd-mm-yyyy'), to_date('31-12-2016','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-01-2017','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-05-2007','dd-mm-yyyy'), to_date('31-05-2007','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-06-2010','dd-mm-yyyy'), to_date('30-09-2010','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-12-2007','dd-mm-yyyy'), to_date('27-05-2008','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-11-2008','dd-mm-yyyy'), to_date('01-11-2008','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-06-2008','dd-mm-yyyy'), to_date('30-06-2008','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-07-2008','dd-mm-yyyy'), to_date('31-10-2008','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-06-2007','dd-mm-yyyy'), to_date('31-10-2007','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-07-2009','dd-mm-yyyy'), to_date('31-05-2010','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-11-2007','dd-mm-yyyy'), to_date('30-11-2007','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('02-11-2008','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-10-2010','dd-mm-yyyy'), to_date('31-07-2011','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('28-05-2008','dd-mm-yyyy'), to_date('31-05-2008','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('02-12-2014','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('02-12-2014','dd-mm-yyyy'), to_date('13-12-2016','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('14-12-2016','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 102, 'ACTIVE', to_date('01-07-2006','dd-mm-yyyy'), to_date('30-04-2007','dd-mm-yyyy') from dual union all 
    select 102, 'NOT_ACTIVE', to_date('01-01-2017','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 101, 'NOT_ACTIVE', to_date('01-09-2010','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-04-2009','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-01-2009','dd-mm-yyyy'), to_date('31-03-2009','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-01-2009','dd-mm-yyyy'), to_date('28-02-2009','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-06-2008','dd-mm-yyyy'), to_date('31-12-2008','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-03-2009','dd-mm-yyyy'), to_date('30-06-2009','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-07-2007','dd-mm-yyyy'), to_date('29-02-2008','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('27-05-2008','dd-mm-yyyy'), to_date('31-05-2008','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('27-03-2008','dd-mm-yyyy'), to_date('26-05-2008','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-04-2007','dd-mm-yyyy'), to_date('31-05-2007','dd-mm-yyyy') from dual union all 
    select 101, 'NOT_ACTIVE', to_date('01-09-2010','dd-mm-yyyy'), to_date('31-12-9999','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-03-2008','dd-mm-yyyy'), to_date('26-03-2008','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-06-2008','dd-mm-yyyy'), to_date('28-02-2009','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('23-10-1992','dd-mm-yyyy'), to_date('31-03-2007','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-06-2007','dd-mm-yyyy'), to_date('30-06-2007','dd-mm-yyyy') from dual union all 
    select 101, 'ACTIVE', to_date('01-07-2009','dd-mm-yyyy'), to_date('31-08-2010','dd-mm-yyyy') from dual 
) 
--select * from MA_MITARBEITER_TH; 
, 
-- uncomment the below line to point to your db 
-- ;with 
emp (id, hired, fired) as 
(
    select user_id, to_number(to_char(sap_valid_from, 'yyyy')), to_number(to_char(sap_valid_to,'yyyy')) 
    from 
    (
     select user_id, min(sap_valid_from) sap_valid_from, max(sap_valid_to) sap_valid_to 
     from MA_MITARBEITER_TH 
     where grp_type = 'ACTIVE' 
     group by user_id 
    ) 
) 
--select * from emp; 
, 
-- grouping of hired by year 
hy (year, cnt) as 
(
    select hired, count(hired) 
    from emp 
    group by hired 
) 
, 
-- grouping of fired by year 
fy (year, cnt) as 
(
    select fired, count(fired) 
    from emp 
    group by fired 
) 
, 
-- put them together with a cte 
-- it takes care of years where no HR activity 
-- anchor is set to the min hired year. 
cte (year, hired, fired, emp_cnt) as 
(
    select hy.year, nvl(hy.cnt ,0), nvl(fy.cnt,0), hy.cnt - nvl(fy.cnt,0) 
    from hy 
     left outer join 
     fy 
     on hy.year = fy.year 
    where hy.year = (select min(year) from hy) 
    union all 
    select cte.year+1, nvl(hy.cnt,0), nvl(fy.cnt,0), cte.emp_cnt + nvl(hy.cnt,0) - nvl(fy.cnt,0) 
    from cte 
     left outer join 
     hy 
     on (cte.year+1 = hy.year) 
     left outer join 
     fy 
     on (cte.year+1 = fy.year) 
    where cte.year < to_char(sysdate, 'yyyy') 
) 
select * from cte; 
    ; 
+0

我正在考虑更多的动态SQL。请参阅上面的示例表和注释。除此之外,我非常感谢您的帮助! – HankerPL

+0

NOT_ACTIVE暗示什么?它是否会影响报告查询?有许多重复的行像第2行和第4行。如果相同的USER_ID在特定年份中有多个条目,那么您是否将它们作为单独的或相同的添加? – Slkrasnodar

+0

在这种情况下,我们只需要为特定的user_id选择ACTIVE GROUP条目,并从VALID_FROM和max中选择最小值。 VALID_TO的值来检查某个员工在公司工作的时间(时间范围)。除此之外,我们通过从DATE中提取年份(VALID_FROM,VALID_TO&SYSDATE作为实际年份=在这种情况下,我假定提取(年份从SYSDATE)应该被处理为最大年份2017 =最大值而不是9999) MAX;) – HankerPL

0

我结合一些疑问,我想现在是我的习惯,请确认是否是此问题少的解决方案:

with YEARS as ( select (to_char(SAP_VALID_FROM,'YYYY') + level -1) AS YEARS from ( SELECT MIN(SAP_VALIDFROM) AS SAP_VALID_FROM, MAX(SYSDATE) AS SAP_VALID_TO FROM MA_MITARBEITER_TH ) YEARS connect by level < = to_char(SYSDATE,'YYYY') - to_char(SAP_VALID_FROM,'YYYY')+1 ), YEARS_SCOPE AS ( SELECT PERSONALNUMMER, EXTRACT(YEAR FROM (MIN(SAP_VALIDFROM))) AS ARBEIT_BEGINN, CASE WHEN EXTRACT(YEAR FROM (MAX(SAP_VALIDTO)))='9999' THEN EXTRACT(YEAR FROM (MAX(SYSDATE))) ELSE EXTRACT(YEAR FROM (MAX(SAP_VALIDTO))) END AS ARBEIT_SCHLUSS FROM MA_MITARBEITER_TH WHERE TIMEGROUP='AKT' GROUP BY PERSONALNUMMER ) select COUNT(*), YEARS FROM YEARS,YEARS_SCOPE WHERE YEARS BETWEEN ARBEIT_BEGINN AND ARBEIT_SCHLUSS GROUP BY YEARS ORDER BY YEARS;

相关问题