2016-01-01 2 views
0

при запуске следующего запроса в SQL Developer, который используется для вычисления количества секунд в секундах, количества секунд в день пятницы, количества секунд с 00:00:00 в 07:30:00 для каждого вызовафункция группы здесь не допускается при запуске сложного запроса

with finala as (
        select CONTACT_ID,LINE_ID, sum(sec) secs, nvl(sum(fri),0) fris, nvl(sum(mrn),0) mrns 
        from (
         select CONTACT_ID,LINE_ID, (least(E_DATE, dt+1)-greatest(S_DATE, dt))*24*60*60 sec, case when trunc(dt) - trunc(dt, 'iw') = 4 then (least(dt+1, E_DATE) - greatest(dt, S_DATE)) * 24*60*60 end fri, case when (((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60)>0 and trunc(dt) - trunc(dt, 'iw') <> 4) then ((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60) end mrn 
         from (
           select CONTACT_ID,LINE_ID, S_DATE, E_DATE, trunc(S_DATE)+level-1 dt 
           from CONTACTS 
           where CONTACTS.LINE_ID = 2 
           connect by trunc(S_DATE)+level-1<=trunc(E_DATE) 
           and prior dbms_random.value is not null and prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID 
         ) 
        ) 
        group by CONTACT_ID,LINE_ID 
        ) 

        select LINE_ID, SUM(secs) into all_seconds ,SUM(fris) into friday_seconds ,SUM(mrns)into twelve_to_seven_second from finala 
        group by LINE_ID; 

где all_seconds и friday_seconds и twelve_to_seven_second являются переменными для хранения окончательных данных,

но компилятор даст ошибке

ORA-00934: group function is not allowed here 00934. 00000 - "group function is not allowed here"

@select LINE_ID, SUM(secs) into all_seconds ,SUM(fris) into friday_seconds ,SUM(mrns)into twelve_to_seven_second from finala

Почему?

[EDIT], как это предлагается в ответ, но все та же ошибка:

select LINE_ID, SUM(secs) into all_seconds ,SUM(fris) into friday_seconds ,SUM(mrns)into twelve_to_seven_second 
       from (
        with finala as (
        select CONTACT_ID,LINE_ID, sum(sec) secs, nvl(sum(fri),0) fris, nvl(sum(mrn),0) mrns 
        from (
         select CONTACT_ID,LINE_ID, (least(E_DATE, dt+1)-greatest(S_DATE, dt))*24*60*60 sec, case when trunc(dt) - trunc(dt, 'iw') = 4 then (least(dt+1, E_DATE) - greatest(dt, S_DATE)) * 24*60*60 end fri, case when (((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60)>0 and trunc(dt) - trunc(dt, 'iw') <> 4) then ((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60) end mrn 
         from (
           select CONTACT_ID,LINE_ID, S_DATE, E_DATE, trunc(S_DATE)+level-1 dt 
           from CONTACTS 
           where CONTACTS.LINE_ID = 2 
           connect by trunc(S_DATE)+level-1<=trunc(E_DATE) 
           and prior dbms_random.value is not null and prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID 
         ) 
        ) 
        group by CONTACT_ID,LINE_ID 
        ) 
       select LINE_ID,secs,fris,mrns from finala 
       ) 
       group by LINE_ID; 
+0

@GuillaumeF. можете ли вы предложить вам предложение в качестве ответа? –

+0

Я удалил свой ответ, так как это не помогло. Если Oracle не позволяет этого, у вас не может быть более одного 'в таблицу' за выбор. –

+0

Я хочу получить результат в переменные, а затем вставить их с помощью 'insert into' в другую таблицу, могу ли я это сделать? –

ответ

0

Немного переформатирование показывает, что вопрос:

select LINE_ID, SUM(secs) into all_seconds, 
     SUM(fris) into friday_seconds, 
     SUM(mrns) into twelve_to_seven_second 
    from (with finala as (select CONTACT_ID, 
           LINE_ID, 
           sum(sec) secs, 
           nvl(sum(fri),0) fris, 
           nvl(sum(mrn),0) mrns 
          from (select CONTACT_ID, 
             LINE_ID, 
             (least(E_DATE, dt+1)-greatest(S_DATE, dt))*24*60*60 sec, 
             case 
             when trunc(dt) - trunc(dt, 'iw') = 4 
              then (least(dt+1, E_DATE) - greatest(dt, S_DATE)) * 24*60*60 
             end fri, 
             case 
             when (((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60)>0 and 
               trunc(dt) - trunc(dt, 'iw') <> 4) 
              then ((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60) 
             end mrn 
            from (select CONTACT_ID, 
               LINE_ID, 
               S_DATE, 
               E_DATE, 
               trunc(S_DATE)+level-1 dt 
              from CONTACTS 
              where CONTACTS.LINE_ID = 2 
              connect by trunc(S_DATE)+level-1<=trunc(E_DATE) and 
                prior dbms_random.value is not null and 
                prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID)) 
          group by CONTACT_ID,LINE_ID) 
     select LINE_ID,secs,fris,mrns 
      from finala) 
    group by LINE_ID; 

Вы не можете иметь несколько INTO положения , как показано в вашем внешнем запросе. Я подозреваю, что это была опечатка, и что вы имели в виду AS вместо INTO

select LINE_ID, 
     SUM(secs) AS ALL_SECONDS, 
     SUM(fris) AS FRIDAY_SECONDS, 
     SUM (mrns) AS TWELVE_TO_SEVEN_SECOND 
    from (with finala as (select CONTACT_ID, 
           LINE_ID, 
           sum(sec) secs, 
           nvl(sum(fri),0) fris, 
           nvl(sum(mrn),0) mrns 
          from (select CONTACT_ID, 
             LINE_ID, 
             (least(E_DATE, dt+1)-greatest(S_DATE, dt))*24*60*60 sec, 
             case 
             when trunc(dt) - trunc(dt, 'iw') = 4 
              then (least(dt+1, E_DATE) - greatest(dt, S_DATE)) * 24*60*60 
             end fri, 
             case 
             when (((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60)>0 and 
               trunc(dt) - trunc(dt, 'iw') <> 4) 
              then ((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60) 
             end mrn 
            from (select CONTACT_ID, 
               LINE_ID, 
               S_DATE, 
               E_DATE, 
               trunc(S_DATE)+level-1 dt 
              from CONTACTS 
              where CONTACTS.LINE_ID = 2 
              connect by trunc(S_DATE)+level-1<=trunc(E_DATE) and 
                prior dbms_random.value is not null and 
                prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID)) 
          group by CONTACT_ID,LINE_ID) 
     select LINE_ID,secs,fris,mrns 
      from finala) 
    group by LINE_ID 

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

select LINE_ID, 
     SUM(secs), 
     SUM(fris), 
     SUM (mrns) 
    INTO nLINE_ID, 
     ALL_SECONDS, 
     FRIDAY_SECONDS, 
     TWELVE_TO_SEVEN_SECOND 
    from (with finala as (select CONTACT_ID, 
           LINE_ID, 
           sum(sec) secs, 
           nvl(sum(fri),0) fris, 
           nvl(sum(mrn),0) mrns 
          from (select CONTACT_ID, 
             LINE_ID, 
             (least(E_DATE, dt+1)-greatest(S_DATE, dt))*24*60*60 sec, 
             case 
             when trunc(dt) - trunc(dt, 'iw') = 4 
              then (least(dt+1, E_DATE) - greatest(dt, S_DATE)) * 24*60*60 
             end fri, 
             case 
             when (((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60)>0 and 
               trunc(dt) - trunc(dt, 'iw') <> 4) 
              then ((least(dt+7.5/24, E_DATE) - greatest(dt, S_DATE)) * 24*60*60) 
             end mrn 
            from (select CONTACT_ID, 
               LINE_ID, 
               S_DATE, 
               E_DATE, 
               trunc(S_DATE)+level-1 dt 
              from CONTACTS 
              where CONTACTS.LINE_ID = 2 
              connect by trunc(S_DATE)+level-1<=trunc(E_DATE) and 
                prior dbms_random.value is not null and 
                prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID)) 
          group by CONTACT_ID,LINE_ID) 
     select LINE_ID,secs,fris,mrns 
      from finala) 
    group by LINE_ID 

Удачи.