【问题标题】:Query to find Employees who have taken more than their eligible leave with respect to their Job Roles查询以查找超过其工作角色的合格假期的员工
【发布时间】:2018-05-30 10:22:14
【问题描述】:

我有以下表格:

Employee24( EMPLOYEEID, FIRSTNAME, LASTNAME, GENDER, JOBROLES);

Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE);

JOBROLESELIGIBLELE(JOBROLES, ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES)

我想编写一个查询来查找在工作岗位方面已休超过合格休假的员工

SELECT * 
  FROM EMPLOYEE24 
  WHERE EMPLOYEEID IN (SELECT EMPLOYEEID 
                        FROM LEAVE25 L WHERE (STARTDATE-ENDDATE)
    < (SELECT ELIGIBLE_SICK_LEAVES + ELIGIBLE_EARNED_LEAVES 
              FROM  JOBROLESELIGIBELE 
              GROUP BY JOBROLES));

【问题讨论】:

  • 请关闭大写锁定!
  • 样本数据、预期结果和术语定义会有所帮助。
  • 表的主键是什么?是Employee24(EmployeeId)、Leave25(EmployeeId,LeaveId)`和JobRolesEligibele(JobRoles)吗?
  • @Thorsten Kethner 是的。
  • 数据模型似乎有点不对劲。我想 LEAVETYPE 表示 ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES (并且接受的答案支持这个假设)。情况不应该如此。在所有表中为不同的休假类型使用列,或者为不同的LEAVETYPE 使用行。不要将两者混为一谈。

标签: sql oracle oracle11g


【解决方案1】:

这将找到每个超出每种休假类型休假金额的用户:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE Employee24( EMPLOYEEID, JOBROLES ) AS
SELECT 1, 'RoleA' FROM DUAL UNION ALL
SELECT 2, 'RoleB' FROM DUAL UNION ALL
SELECT 3, 'RoleB' FROM DUAL;

CREATE TABLE Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE) AS
SELECT 1,1,'SickLeave',  DATE '2018-01-01', DATE '2018-01-11' FROM DUAL UNION ALL
SELECT 1,2,'SickLeave',  DATE '2018-01-21', DATE '2018-01-31' FROM DUAL UNION ALL
SELECT 1,3,'EarnedLeave',DATE '2018-01-11', DATE '2018-01-21' FROM DUAL UNION ALL
SELECT 1,4,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-11' FROM DUAL UNION ALL
SELECT 1,5,'EarnedLeave',DATE '2018-02-21', DATE '2018-03-03' FROM DUAL UNION ALL
SELECT 2,6,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-13' FROM DUAL UNION ALL
SELECT 3,7,'SickLeave',  DATE '2018-01-01', DATE '2018-01-09' FROM DUAL;


CREATE TABLE JOBROLESELIGIBLELE(JOBROLES, ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES) AS
SELECT 'RoleA', 14, 24 FROM DUAL UNION ALL
SELECT 'RoleB',  7, 10 FROM DUAL;

查询 1

SELECT e.employeeId,
       l.leavetype,
       l.days_leave,
       r.AllowedLeaveAmount
FROM   Employee24 e
       INNER JOIN
       ( SELECT employeeId,
                SUM( enddate - startdate ) AS days_leave,
                leavetype
         FROM   Leave25
         GROUP BY employeeId, leaveType
       ) l
       ON ( e.employeeId = l.employeeId )
       INNER JOIN
       ( SELECT *
         FROM   JobRolesEligibleLE
         UNPIVOT ( AllowedLeaveAmount FOR LeaveType IN (
           Eligible_Sick_Leaves   AS 'SickLeave',
           Eligible_Earned_Leaves AS 'EarnedLeave'
         ) )
       ) r
       ON (    l.leavetype = r.leavetype
           AND e.jobroles   = r.jobroles )
WHERE  l.days_leave > r.AllowedLeaveAmount

Results

| EMPLOYEEID |   LEAVETYPE | DAYS_LEAVE | ALLOWEDLEAVEAMOUNT |
|------------|-------------|------------|--------------------|
|          1 |   SickLeave |         20 |                 14 |
|          1 | EarnedLeave |         30 |                 24 |
|          2 | EarnedLeave |         12 |                 10 |
|          3 |   SickLeave |          8 |                  7 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多