查询休假最多的员工
Query for employee who has maximum leaves
我有这些表格,其中包含以下列:
- 员工 24(员工 ID、名字、姓氏、性别、职位);
- 休假 25(雇员 ID、休假 ID、休假类型、开始日期、结束日期);
我想编写一个查询来查找休假次数最多的员工:
select emp.*, L.Startdate - L.Enddate
from leave25 l, employee24 emp
where emp.employeeid = l.employeeid
and l.startdate - l.enddate = (select max(startdate - enddate) from leave25)
您可以使用以下嵌套的 SQL 和 DENSE_RANK() 函数(包括关系(相同的值)):
SELECT EMPLOYEEID, FIRSTNAME, LASTNAME, LEAVE_DAY
FROM
(
SELECT L.EMPLOYEEID, FIRSTNAME, LASTNAME,
(ENDDATE - STARTDATE + 1) LEAVE_DAY,
DENSE_RANK() OVER (ORDER BY (ENDDATE - STARTDATE + 1) DESC) DR
FROM EMPLOYEE24 E JOIN LEAVE25 L ON ( E.employeeid = L.employeeid )
GROUP BY L.EMPLOYEEID, FIRSTNAME, LASTNAME, ENDDATE - STARTDATE + 1
)
WHERE DR = 1
ORDER BY 1;
编辑(根据您的评论“查询过去 1 年休假次数最多的员工月") :
SELECT EMPLOYEEID, FIRSTNAME, LASTNAME,
LEAVE_DAY
FROM
(
SELECT EMPLOYEEID, FIRSTNAME, LASTNAME,
LEAVE_DAY, DENSE_RANK() OVER (ORDER BY LEAVE_DAY DESC) DR
FROM
(
SELECT L.EMPLOYEEID, FIRSTNAME, LASTNAME,
DECODE(SIGN(ENDDATE - ADD_MONTHS(TRUNC(SYSDATE),-1)+1),-1,0,
ENDDATE - ADD_MONTHS(TRUNC(SYSDATE),-1)+1) -
DECODE(SIGN(STARTDATE - ADD_MONTHS(TRUNC(SYSDATE),-1)+1),1,
(STARTDATE - ADD_MONTHS(TRUNC(SYSDATE),-1)),0)
as LEAVE_DAY
FROM EMPLOYEE24 E JOIN LEAVE25 L ON ( E.employeeid = L.employeeid )
)
)
WHERE DR = 1
ORDER BY 1;
试试这个:
Select Top 1 e.EMPLOYEEID,e.Name,SUM(DATEDIFF(d,StartDate,EndDate)+1) as LeaveTaken
from Leave25 l
INNER JOIN Employee24 e on l.EMPLOYEEID=e.EMPLOYEEID
Group By e.EMPLOYEEID,e.Name
Order by LeaveTaken desc
我有这些表格,其中包含以下列:
- 员工 24(员工 ID、名字、姓氏、性别、职位);
- 休假 25(雇员 ID、休假 ID、休假类型、开始日期、结束日期);
我想编写一个查询来查找休假次数最多的员工:
select emp.*, L.Startdate - L.Enddate
from leave25 l, employee24 emp
where emp.employeeid = l.employeeid
and l.startdate - l.enddate = (select max(startdate - enddate) from leave25)
您可以使用以下嵌套的 SQL 和 DENSE_RANK() 函数(包括关系(相同的值)):
SELECT EMPLOYEEID, FIRSTNAME, LASTNAME, LEAVE_DAY
FROM
(
SELECT L.EMPLOYEEID, FIRSTNAME, LASTNAME,
(ENDDATE - STARTDATE + 1) LEAVE_DAY,
DENSE_RANK() OVER (ORDER BY (ENDDATE - STARTDATE + 1) DESC) DR
FROM EMPLOYEE24 E JOIN LEAVE25 L ON ( E.employeeid = L.employeeid )
GROUP BY L.EMPLOYEEID, FIRSTNAME, LASTNAME, ENDDATE - STARTDATE + 1
)
WHERE DR = 1
ORDER BY 1;
编辑(根据您的评论“查询过去 1 年休假次数最多的员工月") :
SELECT EMPLOYEEID, FIRSTNAME, LASTNAME,
LEAVE_DAY
FROM
(
SELECT EMPLOYEEID, FIRSTNAME, LASTNAME,
LEAVE_DAY, DENSE_RANK() OVER (ORDER BY LEAVE_DAY DESC) DR
FROM
(
SELECT L.EMPLOYEEID, FIRSTNAME, LASTNAME,
DECODE(SIGN(ENDDATE - ADD_MONTHS(TRUNC(SYSDATE),-1)+1),-1,0,
ENDDATE - ADD_MONTHS(TRUNC(SYSDATE),-1)+1) -
DECODE(SIGN(STARTDATE - ADD_MONTHS(TRUNC(SYSDATE),-1)+1),1,
(STARTDATE - ADD_MONTHS(TRUNC(SYSDATE),-1)),0)
as LEAVE_DAY
FROM EMPLOYEE24 E JOIN LEAVE25 L ON ( E.employeeid = L.employeeid )
)
)
WHERE DR = 1
ORDER BY 1;
试试这个:
Select Top 1 e.EMPLOYEEID,e.Name,SUM(DATEDIFF(d,StartDate,EndDate)+1) as LeaveTaken
from Leave25 l
INNER JOIN Employee24 e on l.EMPLOYEEID=e.EMPLOYEEID
Group By e.EMPLOYEEID,e.Name
Order by LeaveTaken desc