【发布时间】:2019-03-12 18:01:05
【问题描述】:
我正在使用 Oracle 12c。
我希望计算员工预计上班的天数,以最终报告每个部门每季度的缺勤率。我已经拼凑了一个虚拟表,其中包含每个部门的缺勤天数,我想加入该部门的预期天数(如果一个部门有 3 名员工,那么 5 天工作周有 3 x 5 = 15 人-天)。
我有一个CALENDAR 表,可以告诉我部门是否开放; IS_OPEN 字段中的“x”表示该部门是开放的,并且所有员工都应该报到上班,否则表示该部门已关闭。
CALENDAR(
DEPT_ID VARCHAR2(8) NOT NULL,
QUARTER VARCHAR2(8) NOT NULL,
CALENDAR_DATE DATE NOT NULL,
IS_OPEN VARCHAR2(1) NOT NULL
)
DEPT_ID | QUARTER | CALDR_DATE | IS_OPEN
--------|---------|------------|---------
ACCTING | 2019Q1 | 2019-03-02 | ' '
MFGING | 2019Q1 | 2019-03-02 | x
MRKTING | 2019Q1 | 2019-03-02 | ' '
ACCTING | 2019Q1 | 2019-03-03 | x
MFGING | 2019Q1 | 2019-03-03 | x
MRKTING | 2019Q1 | 2019-03-03 | x
ACCTING | 2019Q1 | 2019-03-04 | x
MFGING | 2019Q1 | 2019-03-04 | x
MRKTING | 2019Q1 | 2019-03-04 | x
...
我还有一个TRANSACTIONS 表,它告诉我员工的开始日期和结束日期(TRANS_TYPE 4 是开始日期,TRANS_TYPE 5 是结束日期)。
TRANSACTIONS(
DEPT_ID VARCHAR2(8) NOT NULL,
QUARTER VARCHAR2(8) NOT NULL,
TRANSACTION_DATE DATE NOT NULL,
TRANSACTION_TYPE NUMBER(1,0) NOT NULL,
EMPLOYEE_ID VARCHAR2(13) NOT NULL
)
DEPT_ID | QUARTER | TRANS_DATE | TRANS_TYPE | EMPLOYEE_ID
--------|---------|------------|------------|------------
...
MFGING | 2019Q1 | 2019-01-07 | 4 | 123
MRKTING | 2019Q1 | 2019-01-28 | 4 | 456
MFGING | 2019Q1 | 2019-02-01 | 5 | 123
...
在上表中,员工 123 于 1 月 7 日开始工作,并于 2 月 1 日离开部门。员工 456 于 1 月 28 日开始工作,至今仍在该部门工作。
从上面的例子中不明显:任何在上一季度担任部门成员的员工在第一天上班时将自动获得TRANS_TYPE4季度(他们在上一季度的最后一天没有得到TRANS_TYPE 5)。
我想连接这两个表,以便生成的虚拟表具有以下字段:DEPT_ID、QUARTER、CALDR_DATE、EMPLOYEE_ID、ATTENDANCE_EXPECTED、DEPT_IS_OPEN(可选),其中ATTENDANCE_EXPECTED 字段包含“1”,如果员工预计当天上班(即,部门是开放的,CALDR_DATE 在员工的开始日期和结束日期之间或SYSDATE 如果没有结束日期存在)。
然后我可以从结果表中SUM(ATTENDANCE_EXPECTED)(或者可能在过滤DEPT_IS_OPEN之后COUNT(*)),并按DEPT_ID、QUARTER分组以获得每个部门和季度的人日数.
我不知道如何扩展行,以便从开始日期到结束日期(如果没有结束日期,则为当前日期)的每一天,每个员工每天都有一行。
我该怎么做,或者有没有更好的方法来计算每个部门每季度的人日?
谢谢。
【问题讨论】:
-
您如何处理假期、病假、假期、陪审团职责以及员工不上班但不会“缺勤”的其他原因?
-
我的“count_absences”查询运行良好;对于不同类型的缺勤,我们有不同的代码,计算中只包含某些代码。这会影响
ATTENDANCE_EXPECTED天数,但误差应该小到可以忽略不计。
标签: sql oracle plsql oracle12c