MySQL - 循环时

时间:2016-07-04 15:44:11

标签: mysql

我被要求创建一份报告,显示在过去12个月(MM-YYYY)期间有多少员工在不同部门工作。

我需要为Department,Role_Name和Employee_Code的每个组合打印每个月。

我想打印出如下所示的结果: (假设员工234在9月15日加入公司担任BSG部门的Jr顾问,然后在1月16日晋升为顾问,然后在4月16日更换部门)

Date    Department Role_Name    Employee_Code
Jun 16  CIN        Consultant   234
Mai 16  CIN        Consultant   234
Apr 16  CIN        Consultant   234
Mrz 16  BSG        Consultant   234
Feb 16  BSG        Consultant   234
Jan 16  BSG        Consultant   234
Dez 15  BSG       Jr Consultant 234
Nov 15  BSG       Jr Consultant 234
Okt 15  BSG       Jr Consultant 234
Sep 15  BSG       Jr Consultant 234

附上我的代码。

DROP PROCEDURE IF EXISTS WhileLoop;
PROCEDURE WhileLoop()

BEGIN
  DECLARE date.date char;

  WhileLoop : Loop  

    IF (date.date < date_format(prs.rpr_end_dt,'%Y-%m')) THEN
      LEAVE WhileLoop;
    END IF;

    SET date.date = date.date;
  END LOOP WhileLoop; 
END;


SELECT
date.date
,prs.EMPLOYEE_ID
,prs.DEPARTMENT
,prs.ROLE_NAME
   ,CASE
        WHEN prs_person_end_dt < curdate() THEN 'No'
        ELSE 'Yes'
    END as 'Still with Company?'

    ,CASE
        WHEN prs_person_end_dt < curdate() THEN concat(month(prs_person_end_dt), ' - ', year(prs_person_end_dt))
        ELSE ''
    END as QuitDate

FROM
   dim_prs_person prs

        /*Used for getting the month/year*/
    inner join (
        select date_format(dys_date,'%Y-%m') as date
        from lkp_dys_days
        group by date_format(dys_date,'%Y-%m')
        ) date on date_format(prs.rpr_start_dt,'%Y-%m') = date.date


/*WHERE
date.date BETWEEN DATE_SUB(CURDATE() ,INTERVAL 12  MONTH ) AND CURDATE()*/

ORDER BY
    prs.PMA_PERSON_CODE
    ,date.date;

结果目前如下:

Date     Employee_code  Department  Role_Name   Still with Company? QuitDate
2015-12     ABNA             OFF    Werkstudent         Quit         Mai 16
2013-02     ADMN             OFF    Werkstudent     
2013-02     ADMN             ECO    Consultant      
2014-08     ADMN             OFF    External Partner        
2007-09     ALDE             ECN    Consultant          Quit          Jun 12
2013-04     BEGD             CIN    Consultant      
2015-10     LAUE             BSO    Werkstudent         Quit          Jan 16
2012-10     PORE             CIN    Praktikant      
2013-01     PORE             CIN    Junior Consultant       
2014-07     PORE             BPN    Consultant      

如您所见,目前不会为每个员工代码,部门和角色名称重复所有月份。例如,对于第一个员工(ABNA),我想要每个月打印一次,直到5月16日,该人退出。

这是lkp_dys_days表的一个示例:

DYS_MONTH   DYS_YEAR    DYS_DATE
7            2004       01.07.2004
7            2004       02.07.2004
7            2004       03.07.2004
7            2004       04.07.2004
7            2004       05.07.2004

这是dim_prs_person表的一个示例:

EMPLOYEE_ID PRS_PERSON_START_DT PRS_PERSON_END_DT   DEPARTMENT  ROLE_NAME
BODA          01.07.2004       30.06.2007            OFF    Jr Consultant
BODA          01.07.2007       31.12.2099            OFF    Consultant
MELE          01.07.2004       30.06.2007            CIN    Consultant
MELE          01.07.2007       31.07.2009            BSD    Sr Consultant
OIDA          01.10.2004       30.09.2008            CIN    Consultant
EMED          01.11.2004       30.11.2006            CIN    Sr Consultant
DKEL          02.11.2004       30.09.2009            BSD    Werkstudent
DHJE          01.12.2004       30.05.2016            BSD    Jr Consultant
DHEH          24.01.2005       23.05.2005            ECO    Jr Consultant
MEINE         01.04.2005       31.08.2007            TDE    Consultant

谢谢!

1 个答案:

答案 0 :(得分:0)

如果我将您的表lkp_dys_days正确理解为所有现有日期的列表(您需要类似的内容),则可以使用

select concat(d.dys_year, '-', lpad(d.dys_month, 2, '0')) as date,
  prs.DEPARTMENT,
  prs.ROLE_NAME,
  prs.EMPLOYEE_ID
from dim_prs_person prs
join lkp_dys_days d
on prs.rpr_start_dt <= d.dys_date 
   and prs.prs_person_end_dt >= d.dys_date
where d.dysdate > date_sub(curdate(), interval 12 month)
      and d.dys_date <= curdate()
group by d.dys_year, d.dys_month, prs.EMPLOYEE_ID, 
         prs.PRS_PERSON_START_DT, prs.DEPARTMENT, prs.ROLE_NAME
order by d.dys_year desc, d.dys_month desc,
         prs.EMPLOYEE_ID, prs.PRS_PERSON_START_DT;

如果您想显示全年,即使此人尚未显示,您也可以使用right outer join代替join