Для будь-якої компанії важливо знати, скільки працівників було активними за певний період. Це дозволяє відстежувати динаміку кадрового потоку та приймати стратегічні рішення з управління персоналом. У цій статті ми розглянемо, як за допомогою SQL створити історичний звіт про кількість активних працівників за місяць.
1 2 |
Select ID, Start Dt, End Dt From Employees |
Цей запит повертає наступні дані:
1 2 3 4 5 6 |
ID | Start Dt | End Dt 1 | 1/1/2023 | 2/3/2023 2 | 2/1/2023 | 3/10/2023 3 | 3/1/2023 | 4/21/2023 4 | 4/1/2023 | 5/15/2023 5 | 5/1/2023 | 6/3/2023 |
Наша мета – перетворити ці дані так, щоб можна було підрахувати кількість активних працівників за кожен місяць. Активний працівник визначається як той, чия дата початку роботи (Start Dt
) попадає в межі місяця і року, і його дата закінчення роботи (End Dt
) також попадає в межі цього місяця і року.
Ми хочемо отримати наступний вигляд звіту:
1 2 3 4 5 6 7 |
Date | Count June 2023 | 1 May 2023 | 2 April 2023 | 3 March 2023 | 2 February 2023| 2 January 2023 | 1 |
Маєте ідеї, як це зробити? Найбільша проблема полягає в тому, щоб створити стовпець з датами окремо від існуючих даних, а потім зв’язати цей стовпець з ‘Start Dt’ і ‘End Dt’ за допомогою функції BETWEEN.
Я спробував створити стовпець з датами і зв’язати його з таблицею працівників наступним чином:
1 2 3 4 5 6 7 |
Select distinct Dt, count(ID) over (order by Dt) from Employees inner join ( select trunc (SYSDATE - ROWNUM) Dt from dual connect by rownum < 365 ) dt on dt between Employees.Start_Dt and Employees.End_Dt |
Але, здається, я щось пропускаю, оскільки є кілька дублікатів рядків і підрахунки не відповідають дійсності. Чи правильний мій підхід?