AVG() 里面 LIST()

AVG() inside LISTAGG()

我需要对两列进行分组,其中一列在 LISTAGG() 中使用平均值 AVG()。
我有以下代码:

CREATE OR REPLACE VIEW countryTimes AS 
SELECT
  LISTAGG(claOL.odCode||'-'||(AVG(claOL.timeCla) GROUP BY(claOl.timeCla))) WITHIN GROUP (ORDER BY c.cCode) 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;



但这会引发此错误:

ORA-00907: 缺少右括号 erecho 00907.00000 - “缺少右括号”*原因:*操作:

我正在使用 Oracle。

更新:
我需要做的是创建一个视图,其中显示 cCode、cDescription 和最后一列,其中包含单个国家/地区所有时间的 AVG。所以我需要从多行创建,每个国家一行。

代码:

    CREATE TABLE Countries (
cCode VARCHAR(5) NOT NULL,
cdescription VARCHAR(100) NOT NULL,
CONSTRAINT couPK PRIMARY KEY (cCode)
);
CREATE TABLE athletes (
idCode NUMBER NOT NULL,
Name VARCHAR(200) NOT NULL,
Surname VARCHAR(200) NOT NULL,
country VARCHAR(5) NOT NULL,
CONSTRAINT athPK PRIMARY KEY (idCode),
CONSTRAINT countryFK FOREIGN KEY (country) REFERENCES Countries (cCode)
);
CREATE TABLE olympicDisciplines (
oCode VARCHAR(10) NOT NULL,
odName VARCHAR(200) NOT NULL,
discipline VARCHAR(200) NOT NULL,
CONSTRAINT olympicPK  PRIMARY KEY (oCode)
);
CREATE TABLE classificationOL(
idAth NUMBER NOT NULL,
odCode VARCHAR(10) NOT NULL,
timeCla INTEGER,
CONSTRAINT classifPK PRIMARY KEY (idAth, odCode),
CONSTRAINT claAthFK FOREIGN KEY (idAth) REFERENCES athletes (idCode),
CONSTRAINT claDFK FOREIGN KEY (odCode) REFERENCES olympicDisciplines (oCode)
);



更新 2:
数据:

INSERT INTO Countries VALUES ('UK', 'United Kingdom');
INSERT INTO Countries VALUES ('AND', 'Andorra');
INSERT INTO Countries VALUES ('FR', 'France');
INSERT INTO athletes VALUES (1, 'Jack', 'Johnson', 'UK');
INSERT INTO athletes VALUES (2, 'Pau', 'Márquez', 'AND');
INSERT INTO athletes VALUES (3, 'Pierre', 'Dubois', 'FR');
INSERT INTO athletes VALUES (4, 'Christophe', 'Dubois', 'FR');
INSERT INTO athletes VALUES (5, 'Adolphe', 'Moreau', 'FR');
INSERT INTO olympicDisciplines VALUES ('ATH', 'Athletics', 'Athletics');
INSERT INTO olympicDisciplines VALUES ('CYC', 'Cycling', 'Cycling');
INSERT INTO olympicDisciplines VALUES ('CCC', 'Cycling CC', 'Cross Country Cycling');
INSERT INTO classificationOL VALUES (1, 'ATH', 120);
INSERT INTO classificationOL VALUES (2, 'ATH', 119);
INSERT INTO classificationOL VALUES (3, 'CCC', 38);
INSERT INTO classificationOL VALUES (4, 'CCC', 37);
INSERT INTO classificationOL VALUES (5, 'ATH', 122);

阅读您的第一个更新,如果允许,您可以将表转换为对象来解决您的需要,而不是使用 LISTAGG()。我会告诉你:

CREATE TYPE average AS OBJECT( 
name VARCHAR(200), 
avgerageTime NUMBER);

CREATE TYPE results AS TABLE OF average;

CREATE TYPE countriesResults AS OBJECT( 
cName VARCHAR(100), 
cCode VARCHAR(5), 
classifications results
);

CREATE VIEW countriesAverages OF countriesResults 
WITH OBJECT OID (coName) 
AS 
SELECT c.cdescription, c.ccode, 
CAST (MULTISET (SELECT 
olympicDisciplines.name, avg(classificationOL.timeCla) 
FROM athletes a, countries, classificationOL, olympicDisciplines 
WHERE countries.cCode = c.cCode 
AND a.idCode = classificationOL.idAth 
AND a.country = countries.cCode 
AND olympicdisciplines.oCode = classificationOL.oCode 
GROUP BY olympicdisciplines.odName) AS results ) 
FROM countries c;