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;
测试数据返回结果
| ProvaTempsMig | País | CodiPaís |
|---|---|---|
| ATH-119 | Andorra | AND |
| CCC-37.5,ATH-122 | France | FR |
| ATH-120 | United Kingdom | UK |
方案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;
测试数据返回结果
| ProvaTempsMig | País | CodiPaís |
|---|---|---|
| 119 | Andorra | AND |
| 65.75 | France | FR |
| 120 | United Kingdom | UK |
内容的提问来源于stack exchange,提问作者Gilet
相关产品推荐
相关产品推荐

