【问题标题】:group function is not allowed here when run complex query运行复杂查询时,此处不允许使用组功能
【发布时间】:2016-01-01 15:18:09
【问题描述】:

当我在 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_secondsfriday_secondstwelve_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;

【问题讨论】:

  • @GuillaumeF。你能把你的建议作为答案吗?
  • 我删除了我的答案,因为它没有帮助。除非 Oracle 允许,否则每个选择的 into table 不能超过一个。
  • SELECT ... INTO .. 只能在 PL/SQL 块中使用。您不能在不声明所有变量的情况下直接在 SQL Developer 中运行此类查询(作为 SQL 查询)。此外,您使用了多个 INTO ->:SELECT x INTO y, p INTO q .., 的错误语法,正确的语法仅包含一个 INTO:SELECT expression-list INTO variable-list,请参阅此链接:docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems045.htm
  • 如果您只想插入这些值,您可以使用INSERT ... SELECT ... 语句 - 请参阅此处的语法:INSERT techonthenet
  • 在插入另一个表之前,为什么要将它们作为变量(在 PL/SQL 块中?)?您的查询将返回多行,除非您只有一个行 ID,因此您正在查看一个集合,而不仅仅是标量变量。

标签: sql oracle group-by


【解决方案1】:

稍微重新格式化即可显示问题所在:

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

祝你好运。

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多