Sql 查询以查找在其工作角色方面休了超过其合格假期的员工
我有以下列的表格:Sql 查询以查找在其工作角色方面休了超过其合格假期的员工,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有以下列的表格: Employee24( EMPLOYEEID, FIRSTNAME, LASTNAME, GENDER, JOBROLES); Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE); JOBROLESELIGIBLELE(JOBROLES, ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES) 我想写一个查询,查找在工作角色方面休了超过法定假期的员工 SELECT *
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));
这将查找超过每种休假类型的休假金额的每个用户: Oracle 11g R2架构设置: 问题1: :
请把帽子锁上!示例数据、期望的结果和术语的定义都会有所帮助。表的主键是什么?是Employee24EmployeeId、Leave25EmployeeId、LeaveId`和JobRolesEligibeleJobRoles吗?@Thorsten Kethner是的。数据模型似乎有点不对劲。我假设LEAVETYPE表示符合条件的病假、符合条件的挣得的假,并且接受的答案支持这一假设。情况不应该如此。在所有表中为不同的休假类型使用列,或为不同的休假类型使用行。不要把两者混为一谈。
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;
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
| EMPLOYEEID | LEAVETYPE | DAYS_LEAVE | ALLOWEDLEAVEAMOUNT |
|------------|-------------|------------|--------------------|
| 1 | SickLeave | 20 | 14 |
| 1 | EarnedLeave | 30 | 24 |
| 2 | EarnedLeave | 12 | 10 |
| 3 | SickLeave | 8 | 7 |