Отображение должности сотрудника в зависимости от стажа работы

#sql #database #group-by #case #union

Вопрос:

Я хочу отобразить список сотрудников, которые все еще активны (в настоящее время не уволены), в зависимости от продолжительности их пребывания в должности, их пребывания в должности в зависимости от лет, а именно: 0-5 лет, 6-10 лет, 11-20 лет, 21-30 лет, > 30 лет. для каждого срока полномочий также указывается должность. поскольку в списке может быть более 1 должности на 1 срок полномочий, то должности делаются с запятыми : годы службы, сумма, должность.

Я пробовал этот код, но он работает не так, как я хочу.

 SELECT TIMESTAMPDIFF(year,A.JoinDt,SYSDATE()) AS 'Years Of Service', COUNT(A.EmpCode) AS 'Amount', B.PosName
FROM tblemployee A
INNER JOIN tblposition B ON A.PosCode = B.PosCode
WHERE A.ResignDt IS NULL
GROUP BY B.PosName
 

Это то, чего я ожидал от

Годы Службы Сумма Название должности
0-5 10 Менеджер
6-10 10 Менеджер
11-20 10 Менеджер
21-30 10 Менеджер
>30 10 Менеджер

Кто-нибудь может мне помочь, пожалуйста ? Спасибо

Ps : сумма и название позиции выше, просто пример вывода. И извините, я не могу предоставить сценарий ввода из-за срока и условий с моим клиентом

Комментарии:

1. пожалуйста, отметьте свои СУБД

Ответ №1:

 **SQL QUERY SHOULD WORK LIKE THIS:

LISTAGG Function may needs to be replaced as it don't support every database but we need to look for alternative function.** 



SELECT A.'Years Of Service',A.PosName,LISTAGG(PosName, '; ')
         WITHIN GROUP (ORDER BY PosName) as "Aggregated_Pos_name",
A.Amount

FROM   (SELECT CASE WHEN (SYSDATE()- a.joindt)/365 <= 5 THEN '0-5'
WHEN (SYSDATE()- a.joindt)/365 BETWEEN 6 AND 10 THEN '6-10'
END AS 'Years Of Service', COUNT(A.EmpCode) AS 'Amount', B.PosName
FROM tblemployee A
INNER JOIN tblposition B ON A.PosCode = B.PosCode
WHERE A.ResignDt IS NULL)A
GROUP BY A.Years of Service;