Помощь - Поиск - Пользователи - Календарь
Полная версия: Вывод кандидатов на отчисление
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Triplet
Здравствуйте.
Помогите, пожалуйста, написать вложенный запрос на sql.
Есть таблица Student с полем ФИО,ID, есть таблица Оценки, т.е. по определённому заданию своя оценка (в процентах) и есть таблица Посещаемость.
На отчисление выводятся те, у кого средний балл меньше 40% и посещаемость <30%.
Я sql начала изучать совсем недавно, могу написать только тривиальный select, так что извиняюсь, если вопрос дурацкийsmile.gif
Заранее спасибо!
volvo
Если у тебя в таблице Оценки хранится несколько оценок для каждого студента по разным предметам, и надо из них для этого студента вычислить среднюю, а в таблице Посещаемость ничего подсчитывать не надо (там уже готовые к обработке данные) - то вот это работает для MS Access SQL:

SQL
SELECT Student.FIO, P.percent, Avg(Grades.Grade) AS AverageGrade
FROM (Student INNER JOIN P ON Student.ID = P.Student) INNER JOIN Grades ON Student.ID = Grades.Student
GROUP BY Student.FIO, P.percent
HAVING (((P.percent)<30) AND ((Avg(Grades.Grade))<"40"));
(P - таблица посещаемости, данные хранятся поле percent; Grades - таблица оценок, в поле Student - ID студента, в поле Grade - оценка по какому-то предмету, в поле Subj - хотя это неважно - название предмета)

Если надо делать какие-то подсчеты и в Посещаемости - уточняй структуру этой таблицы...
Triplet
Спасибо большое!
Только запрос не выводит оценки равные null (тип оценки int),
Пробовала дописать так
(Grades.Grade)=null), но ничего не выводится. Или не должно выводиться?

Пока по посещаемости подсчётов не надо, потом будет задание высчитывать посещаемость(на каждое занятие стоит флаг, если студент был, то true, если нет, то false) и надо будет посчитать кол-во всех true.
volvo
Цитата
Только запрос не выводит оценки равные null
Так запрос вообще не выводит никакие оценки, это вроде как и не требовалось... Выводится только средний балл кандидата на отчисление.
Triplet
В смысле запрос не учитывает тех, у кого оценки=null, т.е. первых кадидатов на отчисление.
volvo
А, я кажется понял... Ты имела в виду выводить ИЛИ тех у кого средняя оценка меньше 40, ИЛИ тех у кого посещаемость ниже 30% smile.gif Мой запрос выводит только тех, у кого И одно И другое условие выполняются одновременно... Поменяй AND на OR, если надо выводить человека с низкой посещаемостью, даже если у него очень высокие баллы... И наоборот.

(напомнило историю про Милуоки и Коннектикут, однажды менеджер обратился к программисту с жалобой, что программа написана неправильно... "Вот, смотри, я ввожу найти клиентов из штатов Милуоки AND Коннектикут, база данных отвечает, что таких клиентов нет!!! А я точно знаю, что у нас есть пользователи и в одном и в другом штате!!!"... На что программист ответил: "Да, но они же не проживают в двух штатах одновременно... Попробуем Милуоки OR Коннектикут...")
Triplet
Нетsmile.gif, я имела ввиду, что даже если оставить одно условие Avg(Grades.Grade))<"40", то будут выводиться те у кого оценка от 0 до 39, а те у кого все оценки = null выводиться не будут, а если я прописываю в условии,
Avg(Grades.Grade))=null, то все равно те у кого оценка = null не выводятсяsad.gif
volvo
Ясно, тебе просто нужно ,чтобы Null-значения считались как нулевые. В MS Access SQL это делается так:
SQL
SELECT Student.FIO, P.percent, Avg(IIf(IsNull([Grades]![Grade]),0,[Grades]![Grade])) AS AverageGrade
FROM (Student INNER JOIN P ON Student.ID = P.Student) INNER JOIN Grades ON Student.ID = Grades.Student
GROUP BY Student.FIO, P.percent
HAVING (((P.percent)<30)) AND (((Avg(IIf(IsNull([Grades]![Grade]),0,[Grades]![Grade])))<40));

(или OR). Функция Iif подставляет значение 0, если в ячейке ничего нет, и тогда все подсчитывается правильно...
Triplet
Спасибо большое!
А в MS SQL 2008 есть аналогичные функции? Или IIF надо через if else организовывать?
volvo
Цитата
Или IIF надо через if else организовывать?
Нет, не через If/Else, насколько я помню, через CASE WHEN, что-то вроде:
avg(case when имя_поля is null then 0 else имя_поля end)
, но лучше все-таки посмотри в доках как записывается эта конструкция, мне просто проверить негде...
Triplet
volvo , ещё раз огромное спасибо!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.