2014-01-12 5 views
0

У меня странное требование. Вот. У меня есть стол.Обновление по дате в Oracle

DateTime    PhoneNo  Network 
------------------- -------- --------- 
11/01/2014 13:05:45 99999999 NetTwo 
11/01/2014 13:05:45 99999999 NetOne 
11/01/2014 13:05:45 99999999 NetOne 
12/01/2014 13:05:45 99999999 NetOne 
12/01/2014 13:06:45 99999999 NetOne 
12/01/2014 13:07:45 88888888 NetTwo 
12/01/2014 13:08:45 77777777 NetThree 

я должен обновить другую таблицу, выполнив хранимую процедуру ежедневно один раз, так что он рассчитывает резюме, сколько раз абонент звонил в день, и он должен обновить его до соответствующего столбца

DestinationTable:

Date  Month year Phone  Network 01 02 03 -------11-12---30-31 
11/01/2014 JAN 2014 99999999 NetOne  0 0 0  2 0 0 0 
11/01/2014 JAN 2014 99999999 NetTwo  0 0 0  1 0 0 0 
12/01/2014 JAN 2014 99999999 NetTwo  0 0 0  0 2 0 0 
12/01/2014 JAN 2014 88888888 NetTwo  0 0 0  0 1 0 0 
12/01/2014 JAN 2014 77777777 NetTwo  0 0 0  0 1 0 0 

Здесь от 01 до 31 находятся отдельные столбцы. Прошу прощения, если я не объясню это должным образом.

Любые предложения или подход, как реализовать это. Спасибо за ваше терпение, чтобы изучить мои проблемы. Любая помощь будет оценена по достоинству.

ответ

0

Спасибо, что много за ваши усилия. Спасибо хаки и Thinkjet. @think: Я узнал о слиянии с вами: D ..

Я получил ожидаемый результат, используя подзапросы внутри результирующего набора с предложением.

WITH MainFilter(CLI,DAYS,COUNTS) 
AS (SELECT TBL_DTL_CALLACTIVITY.CLI, 
TO_CHAR(TBL_DTL_CALLACTIVITY.CALLSTARTTIME, 'DD'),COUNT(TBL_DTL_CALLACTIVITY.CLI) 
FROM TBL_DTL_CALLACTIVITY 
WHERE UPPER(TO_CHAR(TBL_DTL_CALLACTIVITY.CALLSTARTTIME, 'mon')) =UPPER(i_Month) AND 
(SELECTED_DNIS IS NULL OR TBL_DTL_CALLACTIVITY.DNIS = SELECTED_DNIS) 
GROUP BY TBL_DTL_CALLACTIVITY.CLI, 
TO_CHAR(TBL_DTL_CALLACTIVITY.CALLSTARTTIME,'DD')) 
SELECT MF.CLI, 
NVL((SELECT COUNTS FROM MainFilter WHERE MainFilter.DAYS = '01' AND CLI = MF.CLI),0)  AS Day_01, 
NVL((SELECT COUNTS FROM MainFilter WHERE MainFilter.DAYS = '02' AND CLI = MF.CLI),0) AS Day_02, 
NVL((SELECT COUNTS FROM MainFilter WHERE MainFilter.DAYS = '03' AND CLI = MF.CLI),0) AS Day_03, 
-------------------- 
-------------------- 
FROM MainFilter MF GROUP BY MF.CLI ; 

Я беспокоюсь о выполнении запроса. Хорошо ли идти с таким подходом?

0

Это не странно - это называется сводной таблице

это один путь

select trunc(DateTime) as date , to_char(datetimem,'MON') as month , to_number(to_char(datetime,'yyyy')) as year , PhoneNo, network , 
    sum(case when to_char(DateTime,'hh24') = 0 then 1 else 0 end) as h00, 
    sum(case when to_char(DateTime,'hh24') = 1 then 1 else 0 end) as h01, 
    .. 
    sum(case when to_char(DateTime,'hh24') = 23 then 1 else 0 end) as h23 
from calls_tables 
group by trunc(DateTime) , to_char(datetimem,'MON'), to_number(to_char(datetime,'yyyy')) , PhoneNo, network 

11g имеет функцию поворота, а также.

Вы должны запустить поиск по нему.

+0

Поскольку у него 0-31, я полагаю, что это день месяца, а не час дня. Кроме того, вы, вероятно, получите лучшую производительность из запроса с помощью таблицы календаря. –

0

Для периодических обновлений лучше использовать 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 
) 
; 
Смежные вопросы