#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;