SQL 拥有 sum 和 avg 的函数

SQL own Function with sum and avg

我尝试编写一个自己的函数,将值 (NumberStars) 加在一起,然后根据 NUmberStars 计算平均值。

Numberstar 是一个获取一些数字的值,例如它有时获取值 5 有时获取 4 或 2。 函数应该 add/sum 所有这些值,然后计算它们的平均值 该值取自 table:

 CREATE TABLE Rating (
     client_ID NUMBER NOT NULL,
     Tutor_ID NUMBER NOT NULL,
     NumberStars NUMBER NOT NULL,
     Comment VARCHAR2(100) NULL);

CREATE OR REPLACE FUNCTION avgRating( NumberStars NUMBER)
RETURN number
IS
avgRat NUMBER;
BEGIN 
select sum (NumberStars) INTO avgRat FROM Rating;
select avg (avgRat) ;
Return avgRat;
END;

这是我尝试过的,但抱歉这是我的第一个函数

我想,您想获得特定导师的平均评分?那么你可以选择:

CREATE OR REPLACE FUNCTION avgRating (Tutor NUMBER)
RETURN number
IS
avgRat NUMBER;
BEGIN 
SELECT AVG(NumberStars) AS avgRat FROM Rating WHERE Tutor_ID = Tutor;
Return avgRat;
END;

AVG 函数将根据 WHERE 条件自动计算给定字段的平均值。

(在我看来,将 NumberStars 传入函数没有意义 - 否则,请澄清您的问题。)

您不需要为此编写函数,因为有 built-in SUMAVG 函数。

如果你想对每个导师的星星进行总结,那么你可以使用:

SELECT tutor_id,
       SUM(NumberStars) AS total_stars
FROM   rating
GROUP BY tutor_id

如果您想计算所有导师的总星级的平均值,您可以将其包装在外部查询中并取平均值:

SELECT AVG(total_stars) AS avg_total_stars
FROM   (
  SELECT tutor_id,
         SUM(NumberStars) AS total_stars
  FROM   rating
  GROUP BY tutor_id
)

或者,如果您想 return 每个导师并包括总体平均值,您可以使用分析 AVG 函数:

SELECT tutor_id,
       SUM(NumberStars) AS total_stars,
       AVG(SUM(NumberStars)) OVER () AS avg_total_stars
FROM   rating
GROUP BY tutor_id

在这种情况下,将首先计算 GROUP BY 和聚合,然后将分析函数应用于 OVER 整个结果集(因为没有指定更小的分区)。