Вычисление оценок в SQL

#sql

#sql

Вопрос:

Очень просто, мне нужно найти оценки учащихся, используя SQL. Если, например, у меня есть следующая таблица, определяющая оценки

 Marks (int)
Grade (Char)
  

и данные, подобные этому:

 Marks | Grade

__90 | A 

__80 | A

__70 | A-

__60 | B

__50 | C

__40 | D
  

Хорошо, сказав это, если у меня есть ученица, набравшая 73 балла, как мне вычислить ее оценку, используя приведенные выше оценки в SQL.

Большое вам спасибо…

Комментарии:

1. это домашнее задание? если да, то что вы уже пробовали?

2. Ответ Ричарда Френда, по-видимому, является тем, который действительно отвечает на заданный вопрос. Вам следует подумать о замене принятого ответа на этот. Текущий принятый ответ гласит, что он не ответил на ваш вопрос в первом предложении.

Ответ №1:

Если вы хотите получить наибольшее значение, меньшее или равное вашему значению, замените его 73…

select top 1 Grade from TableName where Mark <= 73 order by Mark desc

Ответ №2:

Предполагая, что ваша GradeCutoff таблица создана с помощью чего-то вроде:

 CREATE TABLE GradeCutoff
  ( mark int
  , grade char(3)
  )
  

и вы хотите проверить @studentMark

 SELECT grade
FROM GradeCutoff
WHERE mark =
   ( SELECT max(mark)
     FROM gradeCutoff
     WHERE @studentMark >= mark
   )
;
  

Примечание: возможно, вам также придется добавить строку (0, ‘E’) в таблицу отсечения.

Комментарии:

1. Это не сработает, поскольку «=» не работает, если вторая инструкция select возвращает более 1 строки.

2. @D3: вложенный запрос вернет ровно одну строку (знак или NULL ).

3. Если у меня будет отметка 41, я получу C? которая переходит в следующую оценку, я бы подумал SELECT max(mark) FROM gradeCutoff WHERE mark <= @studentMark

Ответ №3:

Я думаю, вам следует определить UDF для этого, который принимает отметки учащихся в качестве параметра и возвращает оценку в соответствии с приведенной таблицей.

Затем вы можете получить оценку для любого ученика из таблицы student следующим образом —

 select studentID, getGrade(studentMarks) from student
  

Здесь getGrade(studentMarks) — UDF и studentMarks — столбец в таблице учащихся с оценками (например, в вашем случае это 73).

ПОДСКАЗКА: вам нужно использовать CASE конструкцию в UDF, чтобы получить оценку.

Ответ №4:

SELECT Grade FROM 'table name here' WHERE student_mark <= 79 AND student_mark >= 70 — чтобы быть более конкретным, мне нужно было бы увидеть фактическое расположение таблиц. Но что-то, что повлияет на это, сработает.

Комментарии:

1. Это не вернет никаких строк.. в этой таблице нет значений от 70 до 80

2. Тогда я, должно быть, запутался. Существует ли две таблицы или одна? В приложениях для оценивания, которые я разрабатывал ранее, была справочная таблица, которая определяла, какой балл получил какую оценку, а затем таблица students, в которой были указаны оценки. Это то, что я использую в качестве ссылки. Если существует только одна таблица, то знайте, это не сработает.

Ответ №5:

Если оценки на самом деле регулярно кратны 10, вы могли бы заглянуть в функцию SQLs MOD

Комментарии:

1. нет, оценки могут быть любыми. Пользователь / преподаватель может изменять их при необходимости. Итак, мне нужна общая функция, которая принимает входные данные из таблицы оценок и выдает оценку студента. На самом деле нам нужно вычислить ближайшее значение, но я не знаю, как это сделать!

Ответ №6:

Поскольку я не нашел никакого способа сделать это с помощью MySQL, мне пришлось немного поработать с PHP-программированием для достижения результата. Цель состоит в том, чтобы получить наиболее близкое значение из оценок.

Хорошо, предположим, у нас есть оценки, определенные в моем вопросе.

 $MarksObt = 73 <- Marks obtained by the student:
  

Шаг 1: Получите оценки из mysql, упорядоченные по отметкам в порядке ASC (важен порядок ASC):

 SELECT marks, grade FROM gradings ORDER BY marks
  

Шаг 2: Создайте переменную массива «$MinGrades». Повторите результат приведенного выше запроса. Предположим, что результаты MySQL хранятся в массиве «$Gradings». Теперь на каждой итерации выполните следующее:

  1. Вычтите $Grading[‘marks’] из $MarksObt
  2. Если результат больше или равен 0, добавьте результат в массив «$MinGrades»

Шаг 3: Когда цикл завершится, первым элементом массива «$MinGrades» будет ближайшее значение … Выполнено

Ниже приведен PHP-код, который реализует вышеуказанное:

 $MinGrades = array();

foreach($Gradings as $Key=>$Grading){
    $Subtract = $MarksObt - $Grading['marks'];
    if( $Subtract >= 0 )
        array_push($MinGrades, array($Key=>$Subtract))
}

$GradeKey = key($MinGrades[0]); // Get key of first element in the array
print $Gradings[$GradeKey]['grade'];
  

Если у вас есть какой-то лучший подход, пожалуйста, укажите здесь.
Спасибо за ваш вклад…