Я попытался закодировать собственную функцию, которая складывает значения (NumberStars) вместе, а затем вычисляет среднее значение из th NUmberStars.
Numberstar — это значение, которое получает некоторые числа, например, иногда оно получает значение 5, иногда 4 или также 2. И функция должна складывать/суммировать все эти значения, а затем вычислять их среднее значение. значение взято из таблицы:
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;
Это то, что я пробовал, но извините, это моя первая собственная функция
Пожалуйста, редактировать вопрос и объясните на английском языке, в чем проблема, которую вы пытаетесь решить (какие значения вам нужно добавить и что вам нужно усреднить?), и включите операторы INSERT
для некоторых примеров данных и ожидаемого результата. для этих выборочных данных.
Я так понимаю, вы хотите получить средний рейтинг конкретного репетитора? Тогда вы можете просто пойти с:
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
в функцию с моей точки зрения не имеет смысла - в противном случае, пожалуйста, уточните свой вопрос.)
Для этого не нужно писать функцию, так как есть встроенные функции SUM
и AVG
.
Если вы хотите суммировать звезды для каждого репетитора, вы можете использовать:
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
)
Или, если вы хотите вернуть каждого репетитора и включить общее среднее значение, вы можете использовать аналитическую функцию 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
ко всему набору результатов (поскольку меньшие разделы не указаны).
Добро пожаловать в СО. Какой у вас конкретный вопрос? Что вы пробовали до сих пор и в чем проблема?