Для периодических обновлений лучше использовать MERGE
заявление.
Прежде всего, начальная установка для примеров кода ниже:
create table SourceTable(
DateTime date,
PhoneNo varchar2(40),
Network varchar2(20)
);
create table DestinationTable(
CallDate date,
CallMonth varchar2(20),
CallYear number,
Phone varchar2(40),
Network varchar2(20),
d01 number,
d02 number,
d03 number,
d04 number,
d05 number,
d06 number,
d07 number,
d08 number,
d09 number,
d10 number,
d11 number,
d12 number,
d13 number,
d14 number,
d15 number,
d16 number,
d17 number,
d18 number,
d19 number,
d20 number,
d21 number,
d22 number,
d23 number,
d24 number,
d25 number,
d26 number,
d27 number,
d28 number,
d29 number,
d30 number,
d31 number
);
Имена полей изменены в стандартные правила именования.
Схема установки и код, доступные в SQLFiddle.
Далее запрос для демонстрации извлечения даты и времени частей из исходной таблицы для работы с назначением:
select
trunc(call_log.DateTime) CallDate,
to_char(call_log.DateTime,'MON','NLS_DATE_LANGUAGE=ENGLISH') CallMonth,
extract(year from call_log.DateTime) CallYear,
extract(day from call_log.DateTime) CallDay,
PhoneNo Phone,
Network Network
from
SourceTable call_log
order by
datetime, phoneno, network
на основе даты, сети и номере телефона, что можно группировать данные из исходной таблицы и сделать исходные данные для слияния:
select
CallDate,
to_char(CallDate,'MON','NLS_DATE_LANGUAGE=ENGLISH') CallMonth,
extract(year from CallDate) CallYear,
d01, d02, d03, d04, d05, d06, d07, d08, d09, d10,
d11, d12, d13, d14, d15, d16, d17, d18, d19, d20,
d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31
from (
select
CallDate,
Phone,
Network,
sum(decode(callDay, 1,1,0)) d01,
sum(decode(callDay, 2,1,0)) d02,
sum(decode(callDay, 3,1,0)) d03,
sum(decode(callDay, 4,1,0)) d04,
sum(decode(callDay, 5,1,0)) d05,
sum(decode(callDay, 6,1,0)) d06,
sum(decode(callDay, 7,1,0)) d07,
sum(decode(callDay, 8,1,0)) d08,
sum(decode(callDay, 9,1,0)) d09,
sum(decode(callDay,10,1,0)) d10,
sum(decode(callDay,11,1,0)) d11,
sum(decode(callDay,12,1,0)) d12,
sum(decode(callDay,13,1,0)) d13,
sum(decode(callDay,14,1,0)) d14,
sum(decode(callDay,15,1,0)) d15,
sum(decode(callDay,16,1,0)) d16,
sum(decode(callDay,17,1,0)) d17,
sum(decode(callDay,18,1,0)) d18,
sum(decode(callDay,19,1,0)) d19,
sum(decode(callDay,20,1,0)) d20,
sum(decode(callDay,21,1,0)) d21,
sum(decode(callDay,22,1,0)) d22,
sum(decode(callDay,23,1,0)) d23,
sum(decode(callDay,24,1,0)) d24,
sum(decode(callDay,25,1,0)) d25,
sum(decode(callDay,26,1,0)) d26,
sum(decode(callDay,27,1,0)) d27,
sum(decode(callDay,28,1,0)) d28,
sum(decode(callDay,29,1,0)) d29,
sum(decode(callDay,30,1,0)) d30,
sum(decode(callDay,31,1,0)) d31
from (
select
trunc(call_log.DateTime) CallDate,
extract(day from call_log.DateTime) CallDay,
PhoneNo Phone,
Network Network
from
SourceTable call_log
)
group by
CallDate, Phone, Network
)
order by
CallDate, Phone, Network
И последний шаг слияние подготовленных данных в таблицу назначения:
merge into DestinationTable call_totals
using (
select -- Previous select (removed unneeded columns and ordering)
CallDate,
Phone,
Network,
sum(decode(callDay, 1,1,0)) d01,
sum(decode(callDay, 2,1,0)) d02,
sum(decode(callDay, 3,1,0)) d03,
sum(decode(callDay, 4,1,0)) d04,
sum(decode(callDay, 5,1,0)) d05,
sum(decode(callDay, 6,1,0)) d06,
sum(decode(callDay, 7,1,0)) d07,
sum(decode(callDay, 8,1,0)) d08,
sum(decode(callDay, 9,1,0)) d09,
sum(decode(callDay,10,1,0)) d10,
sum(decode(callDay,11,1,0)) d11,
sum(decode(callDay,12,1,0)) d12,
sum(decode(callDay,13,1,0)) d13,
sum(decode(callDay,14,1,0)) d14,
sum(decode(callDay,15,1,0)) d15,
sum(decode(callDay,16,1,0)) d16,
sum(decode(callDay,17,1,0)) d17,
sum(decode(callDay,18,1,0)) d18,
sum(decode(callDay,19,1,0)) d19,
sum(decode(callDay,20,1,0)) d20,
sum(decode(callDay,21,1,0)) d21,
sum(decode(callDay,22,1,0)) d22,
sum(decode(callDay,23,1,0)) d23,
sum(decode(callDay,24,1,0)) d24,
sum(decode(callDay,25,1,0)) d25,
sum(decode(callDay,26,1,0)) d26,
sum(decode(callDay,27,1,0)) d27,
sum(decode(callDay,28,1,0)) d28,
sum(decode(callDay,29,1,0)) d29,
sum(decode(callDay,30,1,0)) d30,
sum(decode(callDay,31,1,0)) d31
from (
select
trunc(call_log.DateTime) CallDate,
extract(day from call_log.DateTime) CallDay,
PhoneNo Phone,
Network Network
from
SourceTable call_log
)
group by
CallDate, Phone, Network
) existing_calls
on (
-- Link prepared data from source table to destination
call_totals.CallDate = existing_calls.CallDate
and
call_totals.Phone = existing_calls.Phone
and
call_totals.Network = existing_calls.Network
)
when matched then
-- If record for date, phone and record found - update statistics
update
set
d01 = existing_calls.d01,
d02 = existing_calls.d02,
d03 = existing_calls.d03,
d04 = existing_calls.d04,
d05 = existing_calls.d05,
d06 = existing_calls.d06,
d07 = existing_calls.d07,
d08 = existing_calls.d08,
d09 = existing_calls.d09,
d10 = existing_calls.d10,
d11 = existing_calls.d11,
d12 = existing_calls.d12,
d13 = existing_calls.d13,
d14 = existing_calls.d14,
d15 = existing_calls.d15,
d16 = existing_calls.d16,
d17 = existing_calls.d17,
d18 = existing_calls.d18,
d19 = existing_calls.d19,
d20 = existing_calls.d20,
d21 = existing_calls.d21,
d22 = existing_calls.d22,
d23 = existing_calls.d23,
d24 = existing_calls.d24,
d25 = existing_calls.d25,
d26 = existing_calls.d26,
d27 = existing_calls.d27,
d28 = existing_calls.d28,
d29 = existing_calls.d29,
d30 = existing_calls.d30,
d31 = existing_calls.d31
when not matched then
-- If record for date, phone and record not found - add new one
insert (
CallDate, CallMonth, CallYear, Phone, Network,
d01, d02, d03, d04, d05, d06, d07, d08, d09, d10,
d11, d12, d13, d14, d15, d16, d17, d18, d19, d20,
d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31
) values (
existing_calls.CallDate,
to_char(existing_calls.CallDate, 'MON', 'NLS_DATE_LANGUAGE=ENGLISH'),
extract(year from existing_calls.CallDate),
existing_calls.Phone,
existing_calls.Network,
existing_calls.d01,
existing_calls.d02,
existing_calls.d03,
existing_calls.d04,
existing_calls.d05,
existing_calls.d06,
existing_calls.d07,
existing_calls.d08,
existing_calls.d09,
existing_calls.d10,
existing_calls.d11,
existing_calls.d12,
existing_calls.d13,
existing_calls.d14,
existing_calls.d15,
existing_calls.d16,
existing_calls.d17,
existing_calls.d18,
existing_calls.d19,
existing_calls.d20,
existing_calls.d21,
existing_calls.d22,
existing_calls.d23,
existing_calls.d24,
existing_calls.d25,
existing_calls.d26,
existing_calls.d27,
existing_calls.d28,
existing_calls.d29,
existing_calls.d30,
existing_calls.d31
)
;
Поскольку у него 0-31, я полагаю, что это день месяца, а не час дня. Кроме того, вы, вероятно, получите лучшую производительность из запроса с помощью таблицы календаря. –