Джоин двух таблиц,как

Molodb
Дата: 20.10.2015 10:06:41
Всем привет! Есть две таблицы, данные лежат примерно в таком виде:
create table test752 (vid number, year number, start_plan date, end_plan date, repair_t number);
insert into test752 values (1,2015, to_date('2015-05-14', 'YYYY-MM-DD'),to_date('2015-05-16', 'YYYY-MM-DD'),1);
insert into test752 values (1,2015, to_date('2015-08-16', 'YYYY-MM-DD'),to_date('2015-08-20', 'YYYY-MM-DD'),1);

create table test762 (vid number, year number,month number, start_fact date, end_fact date, repair_t number);
insert into test762 values (1,2015,5 ,to_date('2015-05-18', 'YYYY-MM-DD'),to_date('2015-05-20', 'YYYY-MM-DD'),1);
insert into test762 values (1,2015,8 ,to_date('2015-08-16', 'YYYY-MM-DD'),to_date('2015-08-22', 'YYYY-MM-DD'),2);
JDS
Дата: 20.10.2015 10:08:40
И? )
Molodb
Дата: 20.10.2015 10:16:44
Случайно опубликовал раньше времени...
Необходимо сделать left join по vid и year таким способом, чтобы для каждого месяца в 76 таблице выдавались все строки из 75, но при том условии, что если MONTH из таблицы 76 не совпадает с месяцом из start_plan в 75, то все поля кроме vid,year, month,start_plan и end plan должны быть null.
Выглядеть должно примерно так
VID	YEAR	MONTH	START_FACT	END_FACT	START_PLAN	END_PLAN	REPAIR_T
1	2015	5	18.05.15	20.05.15	14.05.15	16.05.15	1
1	2015	8	null             null           16.08.15        20.08.15    	2
1	2015	8	16.08.15	22.08.15	16.08.15	20.08.15	1
1	2015	5	null	         null	        14.05.15	16.05.15	2
JDS
Дата: 20.10.2015 10:29:51
Ну так case )
Molodb
Дата: 21.10.2015 11:18:49
Задача мощнейшим образом мутировала...
Постараюсь объяснить всю структуру данных, типичный вид первой таблицы:
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, к которой как-то будет прикручено регулярное выражение, берущее последнюю запись, но тогда записи для всех месяцев буду сразу одинаково заполнены, чего не должно быть.
Очень требуется помощь.
Заранее спасибо!
JDS
Дата: 21.10.2015 11:30:08
Столько букв... Чтобы не надеяться, что найдутся бездельники, которые это будут читать и вникать, лучше было бы точнее
локализовать проблему, то есть: у тебя не получается написать какой-то конкретно момент в sql запросе?
Вот именно этот момент и покажи (на минимуме полей), не надо всей этой лирики про оборудование и прочую муть )
Входные тестовые данные и что на выходе надо получить, а то что ты написал, это почти какое-то мутное ТЗ, за реализацию которого некоторые и деньги получают иногда )
JDS
Дата: 21.10.2015 12:09:37
Molodb
НО смысл в том, чтобы все последующие месяцы накапливали все предыдущие изменения для того или иного id75.
Пока есть идея применять ,например, для причины отклонения следующую запись listagg(exclude, ', ') WITHIN GROUP(order by id) over(partition by id) as exclude_r, к которой как-то будет прикручено регулярное выражение, берущее последнюю запись, но тогда записи для всех месяцев буду сразу одинаково заполнены, чего не должно быть.

Может визингруп тупо так допилить?
+
WITH t AS (SELECT 1 nm, 'a' vch FROM  dual
           UNION ALL
           SELECT 2 nm, 'b' vch FROM  dual 
           UNION ALL
           SELECT 3 nm, 'c' vch FROM  dual
           UNION ALL
           SELECT 4 nm, 'd' vch FROM  dual)
SELECT nm, vch, 
       sum_num "Накопили цифры",
       SUBSTR(sum_char, 1, INSTR(sum_char, ', ', 1, rnum)) "Накопили буквы"
  FROM (SELECT nm, vch,
              SUM(nm) OVER(ORDER BY nm) sum_num,
              LISTAGG(VCH, ', ') WITHIN GROUP(ORDER BY nm) OVER()||', ' AS sum_char,
              ROW_NUMBER() OVER(ORDER BY nm) rnum
         FROM t)
Molodb
Дата: 21.10.2015 12:38:10
JDS,
таким методом суммировать цифры не нужно будет, сначала все параметры должны складываться в строчку как у вас и из этой строчки берется уже последняя запись( при помощи регулярного выражения).я сейчас попробую применить Ваше "Накопили буквы" для своих данных, спасибо
andreymx
Дата: 21.10.2015 12:41:30
Molodb
Задача мощнейшим образом мутировала...
запейсал в блокнот умных мыслей