Запрос для сотрудника, который имеет максимальное количество отпусков - PullRequest
0 голосов
/ 01 июня 2018

У меня есть эти таблицы со следующими столбцами:

  • Employee24 (EMPLOYEEID, FIRSTNAME, LASTNAME, GENDER, JOBROLES);
  • Leave25 (EMPLOYEEID, LEAVEID, LEAVETYPE, STARTDATE,ENDDATE);

Я хочу написать запрос, чтобы найти сотрудника, который получил максимальное количество отпусков:

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)

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

попробуйте это:

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
0 голосов
/ 01 июня 2018

Вы можете использовать следующий вложенный 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;

Демонстрация SQL Fiddle

Редактировать (в соответствии с вашим комментарием " запрос для сотрудников, которые получили максимальное количество отпусков за последний месяц "):

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; 

Демонстрация SQL Fiddle 2

...