You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle使用LISTAGG嵌套AVG创建视图报ORA-00907错误求助

问题根因
  • 触发ORA-00907报错的核心原因是语法不规范:Oracle不支持在AVG()函数内部嵌套GROUP BY子句,GROUP BY是独立的查询子句,不能放在聚集函数的参数中,解析器识别到非法语法后就会抛出括号缺失的报错。
  • 另外原SQL缺少最外层的GROUP BY逻辑,你需要按国家维度聚合得到单条记录,必须对非聚集的国家字段做分组。
实现方案

方案1:按项目拼接平均时长(匹配你最初LISTAGG的写法意图)

如果你的需求是最后一列拼接每个项目对应的该国平均时长,格式为项目编码-平均时长,项目编码-平均时长,使用以下代码:

CREATE OR REPLACE VIEW countryTimes AS 
SELECT
  LISTAGG(t.odCode || '-' || t.avg_time, ',') WITHIN GROUP (ORDER BY t.odCode) AS ProvaTempsMig,
  t.cDescription AS País,
  t.cCode AS CodiPaís
FROM (
  -- 先按国家、项目分组计算每个项目的平均时长
  SELECT
    c.cCode,
    c.cDescription,
    claOL.odCode,
    AVG(claOL.timeCla) AS avg_time
  FROM countries c 
  JOIN athletes a ON c.cCode = a.country 
  JOIN classificationOL claOL ON a.idCode = claOL.idAth
  GROUP BY c.cCode, c.cDescription, claOL.odCode
) t
GROUP BY t.cCode, t.cDescription;

测试数据返回结果

ProvaTempsMigPaísCodiPaís
ATH-119AndorraAND
CCC-37.5,ATH-122FranceFR
ATH-120United KingdomUK

方案2:仅展示国家整体平均时长(匹配你更新说明的需求)

如果你的需求是最后一列仅展示该国所有参赛记录的总平均时长,不需要按项目拆分拼接,使用以下代码:

CREATE OR REPLACE VIEW countryTimes AS 
SELECT
  AVG(claOL.timeCla) AS ProvaTempsMig,
  c.cDescription AS País,
  c.cCode AS CodiPaís
FROM countries c 
JOIN athletes a ON c.cCode = a.country 
JOIN classificationOL claOL ON a.idCode = claOL.idAth
GROUP BY c.cCode, c.cDescription;

测试数据返回结果

ProvaTempsMigPaísCodiPaís
119AndorraAND
65.75FranceFR
120United KingdomUK

内容的提问来源于stack exchange,提问作者Gilet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:15:04