У меня есть таблица с несколькими командами отделов, которая записывает количество пользователей.
Строки отдела обновляются каждый день, если в пользователях происходят какие-либо изменения, добавляется новая запись, либо обновляется только последний столбец.Если отделы закроются, он прекратит обновление этой записи.
Я думаю, что получил большую часть отчета, но каким-то образом не смог отобразить достойный отчет.
Требования
- Отдел и количество пользователей за 3 месяца (текущий и предыдущие 2 месяца)
- не уверен, могу ли я принять нет.месяцев во время выполнения и запрос может определить требуемые месяцы для отображения.
Имя столбца списка в виде Месяц-ГГГГ
Код:
create table departments
(
dept varchar2(20),
started date,
users number(6),
row_updated date
);
insert into departments
values ('Developer', DATE'2019-09-25', 20, sysdate);
insert into departments
values ('Developer', DATE'2019-08-15', 15, sysdate);
insert into departments
values ('Developer', DATE'2019-03-03', 10, sysdate);
insert into departments
values ('Developer', DATE'2019-03-01', 5, sysdate);
insert into departments
values ('Manager', DATE'2019-01-01', 3, sysdate);
insert into departments
values ('HR', DATE'2019-08-15', 6, sysdate);
insert into departments
values ('HR', DATE'2019-05-01', 3, sysdate);
Таблица:
Dept Started Users Row_Updated
---------- ------------ ----- -------------
Developer 25-SEP-2019 20 25-SEP-2019
Developer 15-AUG-2019 15 25-SEP-2019
Developer 03-MAR-2019 10 25-SEP-2019
Developer 01-MAR-2019 5 25-SEP-2019
Manager 01-JAN-2019 3 25-SEP-2019
HR 15-AUG-2019 5 25-SEP-2019
HR 01-MAY-2019 3 25-SEP-2019
Отчет: (подсчитывать количество пользователей на каждыймесяц)
DEPT JUL-2019 AUG-2019 SEP-2019
--------- -------- -------- --------
Developer 10 15 20
Manager 3 3 3
HR 3 5 5
Запрос на сентябрь:
-- below query will display all departments status as of sept
SELECT dept, users
FROM
(SELECT
dept, started, users,
rank() over partition by dept
order by started desc) seq
FROM
departments
WHERE
trun(started,'MM') <= add_months(trunc(sysdate, 'MM'), -0)) d
WHERE
seq = 1
ORDER BY
1
Я использую вышеупомянутый запрос 3 раза с изменением в предложении WHERE, заменяя 0 на 1 и 2 и выбирая все результаты другим выбороми присоединяйтесь.
Выбор из списка 3 раза выглядит не очень хорошо, и если завтра, если нам понадобится 6 месяцев, запрос должен снова измениться.