У меня есть следующие таблицы, как показано на картинках.
Я хочу рассчитать среднее значение оценок для каждого учащегося {Avg = Sum (примечание * коэффициент) / Sum (коэффициенты)} а затем обновить столбец диапазона в таблице ETUDIANT в зависимости от среднего и пропустить диапазон для равных средних значений с помощью курсоров в PL/SQL! как на картинке ниже
Как можно подойти к этому, потому что я новичок в pl/sql в целом, и спасибо!
Я написал оператор выбора, который выбирает заметки и коэфф, это все, что я мог понять.
select NOTE,COEFFICIENT from notes left join module on notes.CODE_M = module.CODE_M order by notes.NOTE desc;
я ожидаю, по крайней мере, способ подойти к этой проблеме, и спасибо
Не используйте PL/SQL или курсоры, просто используйте SQL и оператор MERGE
и агрегируйте примечания и коэффициенты, чтобы получить средневзвешенное значение для каждого учащегося, а затем используйте аналитическую функцию RANK
для расчета диапазона:
MERGE INTO etudiant
USING (
SELECT n.code_e,
SUM(n.note * m.coefficient) / SUM(m.coefficient) AS weighted_note,
RANK() OVER (ORDER BY SUM(n.note * m.coefficient) / SUM(m.coefficient)) AS rnk
FROM notes n
INNER JOIN module m
ON (m.code_m = n.mode_m)
) c
ON (e.code_e = c.code_e)
WHEN MATCHED THEN
UPDATE
SET moyenne = c.weighted_note,
rang = c.rnk;
Если вам нужны пробелы, сделайте это при отображении данных:
SELECT NULLIF(rang, LAG(rang) OVER (ORDER BY moyenne DESC, code_e)) AS rang,
code_e,
nom,
prenom,
moyenne,
spcialite
FROM etudiant;
@SeffihOualidRedouan Сделайте это в любом приложении, которое вы используете для извлечения данных из таблицы; не пытайтесь хранить пробелы в таблице.
и как мне заставить его пропустить ранг для равных значений, как показано на первом рисунке, и спасибо за ответ!