Как подсчитать количество по каждому месяцу одним запросом, если известен начало и конец работы?
Мне необходимо узнать количество сотрудников, которые работали в заданные месяцы, если известна дата начала работы и дата окончания работы.
Моя таблица выглядит так:
| ID | Name | Start_Date | End_date |
|---|---|---|---|
| 1 | John | 15.01.2020 | 06.08.2020 |
| 2 | Nikhil | 14.03.2020 | 25.11.2020 |
| ... | ... | ... | ... |
Ожидаю получить такой результат:
| month | count(ID) |
|---|---|
| Jun | 2 |
| Feb | 8 |
| ... | ... |
| Dec | 3 |
Я знаю, как узнать количество для каждого месяца отдельним запросом:
Select COUNT(ID)
FROM tab
where Start_Date=<31.01.2020 AND End_date>=01.01.2020
Но поскольку такую операцию мне нужду сделать для каждого месяца для нескольких лет, то менять даты вручную для каждого месяца слишком долго.
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Надо просто генерировать табличные значения для каждого месяца в заданном диапазоне времени, а затем соединить их с исходной таблицей. В таблице params заданный диапазон - с какого месяца считать, сколько месяцев.
На db<>fiddle с тестовыми данными:
with params as (
select date'2020-01-01' from#, 12 months# from dual
)
select to_char (mon, 'Mon rr') month, count (id)
from (
select add_months (trunc (from#, 'mm'), level-1) mon
from params connect by level<=months#)
left join tab t on (t.sdt <= last_day (mon) and t.edt >= mon)
group by mon
order by mon
/
Результат:
MONTH COUNT(ID)
--------------- ----------
Jan 20 1
Feb 20 1
Mar 20 2
Apr 20 2
May 20 2
Jun 20 2
Jul 20 2
Aug 20 3
Sep 20 2
Oct 20 2
Nov 20 1
Dec 20 0