【发布时间】: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_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;
【问题讨论】:
-
@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,因此您正在查看一个集合,而不仅仅是标量变量。