Задача мощнейшим образом мутировала...
Постараюсь объяснить всю структуру данных, типичный вид первой таблицы:
create table test75x (id number, vid number, year number, start_plan varchar2(15), end_plan varchar2(15), repair_t number);
insert into test75x values (1,1,2015,'a','b',1);
insert into test75x values (2,1,2015,'a1','b1',1);
insert into test75x values (3,1,2015,'a2','b2',2);
Эта таблица является годовым плановым расписанием ремонтов оборудования некой компании. VID-номер этого оборудования, YEAR- отчетный год, start_plan и end_plan , плановые даты начала и окончания ремонта ( для того чтобы абстрагироваться от цифр взял их как буквы), repair_t - вид ремонта. То есть в 2015 планируется оборудование "1" отремонтаровать 3 раза, плановое начало ремонтов- a,a1,a2.
Вторая таблица это фактический отчет ремонтов по месяцам, эта таблица связана с первой:
create table test76x (id75 number,vid number, year number,month number, start_fact varchar2(15), end_fact varchar2(15), start_plan varchar2(15), end_plan varchar2(15), repair_t number,start_cor varchar2(15), end_cor varchar2(15), exclude number );
insert into test76x values (1,1,2015,01,null,null,'a','b',null,'a+1','b+1',null );
insert into test76x values (1,1,2015,03,'a+1','b+1','a','b',null,null,null,null );
insert into test76x values (2,1,2015,02,null,null,'a1','b1',null,null,null,3 );
insert into test76x values (3,1,2015,02,null,null,'a2','b2',null,null,null,2 );
Здесь id75- id первой таблицы , start_fact - end_fact фактическое начало и конец ремонта, start_cor и end_cor cкорректированные даты начала и конца, exclude- это на случай если плановый ремонт отменен- идентификатор причины отмены ремонта.
Т.е. первая запись во второй таблице гласит , что оператор в январе внес скоректированную даты для планового ремонта с id =1 и плановыми датами a и b. Вторая же запись говорит о том что оператор внес в форму данные об внесении фактических дат начала и конца ремонта с id =1 и плановыми датами a и b.(оператор может забыть внести сперва скорректированную дату, а сразу внеси в базу фактические данные ремонта).
Первая состоит в том, чтобы к каждому месяцу в 76 отчете джоинился весь план 75. Это я сделал следующим образом
select
id,
p.vid,
p.year,
p.month,
p.start_fact,
p.end_fact,
p2.start_plan,
p2.end_plan,
p.start_cor,
p.end_cor,
p.repair_t,
p.exclude
from test76x p
left join test75x p2 on p2.id=p.id75
union all
select
distinct
id,
p.vid,
p.year,
p.month,
null as start_fact,
null as end_fact,
p2.start_plan,
p2.end_plan,
null as start_cor,
null as end_cor,
null as repair_t,
null as exclude
from test76x p
left join test75x p2 on p.vid=p2.vid and p.year=p2.year and p2.id<>p.id75
В результате получаю
ID VID YEAR MONTH START_FACT END_FACT START_PLAN END_PLAN START_COR END_COR REPAIR_T EXCLUDE
1 1 2015 1 a b a+1 b+1
2 1 2015 1 a1 b1
3 1 2015 1 a2 b2
3 1 2015 2 a2 b2
2 1 2015 2 a1 b1
3 1 2015 2 a2 b2 2
2 1 2015 2 a1 b1 3
1 1 2015 2 a b
2 1 2015 3 a1 b1
1 1 2015 3 a+1 b+1 a b
3 1 2015 3 a2 b2
НО смысл в том, чтобы все последующие месяцы накапливали все предыдущие изменения для того или иного id75.
То есть данные должны выглядеть так:
ID VID YEAR MONTH START_FACT END_FACT START_PLAN END_PLAN START_COR END_COR REPAIR_T EXCLUDE
1 1 2015 1 a b a+1 b+1
2 1 2015 1 a1 b1
3 1 2015 1 a2 b2
3 1 2015 2 a2 b2 2
2 1 2015 2 a1 b1 3
3 1 2015 2 a2 b2 2
2 1 2015 2 a1 b1 3
1 1 2015 2 a b a+1 b+1
2 1 2015 3 a1 b1 3
1 1 2015 3 a+1 b+1 a b a+1 b+1
3 1 2015 3 a2 b2 2
Информация каждый месяц должна обновляться, с каждым месяц все больше дополнений , и по идее к декабрю картина становится полной, а в январе наоборот.
Пока есть идея применять ,например, для причины отклонения следующую запись listagg(exclude, ', ') WITHIN GROUP(order by id) over(partition by id) as exclude_r, к которой как-то будет прикручено регулярное выражение, берущее последнюю запись, но тогда записи для всех месяцев буду сразу одинаково заполнены, чего не должно быть.
Очень требуется помощь.
Заранее спасибо!