Собственная функция SQL с суммой и средним значением

Я попытался закодировать собственную функцию, которая складывает значения (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;

Это то, что я пробовал, но извините, это моя первая собственная функция

Добро пожаловать в СО. Какой у вас конкретный вопрос? Что вы пробовали до сих пор и в чем проблема?

ahuemmer 07.05.2022 13:57

Пожалуйста, редактировать вопрос и объясните на английском языке, в чем проблема, которую вы пытаетесь решить (какие значения вам нужно добавить и что вам нужно усреднить?), и включите операторы INSERT для некоторых примеров данных и ожидаемого результата. для этих выборочных данных.

MT0 07.05.2022 14:09
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я так понимаю, вы хотите получить средний рейтинг конкретного репетитора? Тогда вы можете просто пойти с:

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 ко всему набору результатов (поскольку меньшие разделы не указаны).

Другие вопросы по теме