#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». Теперь на каждой итерации выполните следующее:
- Вычтите $Grading[‘marks’] из $MarksObt
- Если результат больше или равен 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'];
Если у вас есть какой-то лучший подход, пожалуйста, укажите здесь.
Спасибо за ваш вклад…