【发布时间】:2016-11-06 09:41:54
【问题描述】:
我被要求创建一份报告,显示过去 12 个月 (MM-YYYY) 内不同部门工作的员工人数。
我需要每个月打印部门、角色名称和员工代码的每个组合。
我想打印如下所示的结果: (假设员工 234 于 9 月 15 日加入公司,担任 BSG 部门的 Jr Consultant,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
谢谢!
【问题讨论】:
-
我不确定结果是否符合您的描述(当您想要一个部门每月的员工总数时,您的结果中的“顾问”和“Jr 顾问”是什么意思?)。您不需要循环,您需要
group by和sum()或count()。你应该添加你的表格描述/一些示例数据。 -
我编辑了所有内容以使问题更清晰。我很确定 sum()、count() 和 group by () 不足以解决这个问题。
标签: mysql