IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Вывод кандидатов на отчисление, Помогите, пожалуйста.
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 78
Пол: Женский

Репутация: -  0  +


Здравствуйте.
Помогите, пожалуйста, написать вложенный запрос на sql.
Есть таблица Student с полем ФИО,ID, есть таблица Оценки, т.е. по определённому заданию своя оценка (в процентах) и есть таблица Посещаемость.
На отчисление выводятся те, у кого средний балл меньше 40% и посещаемость <30%.
Я sql начала изучать совсем недавно, могу написать только тривиальный select, так что извиняюсь, если вопрос дурацкийsmile.gif
Заранее спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Если у тебя в таблице Оценки хранится несколько оценок для каждого студента по разным предметам, и надо из них для этого студента вычислить среднюю, а в таблице Посещаемость ничего подсчитывать не надо (там уже готовые к обработке данные) - то вот это работает для 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 - хотя это неважно - название предмета)

Если надо делать какие-то подсчеты и в Посещаемости - уточняй структуру этой таблицы...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 78
Пол: Женский

Репутация: -  0  +


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

Пока по посещаемости подсчётов не надо, потом будет задание высчитывать посещаемость(на каждое занятие стоит флаг, если студент был, то true, если нет, то false) и надо будет посчитать кол-во всех true.

Сообщение отредактировано: Triplet -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Только запрос не выводит оценки равные null
Так запрос вообще не выводит никакие оценки, это вроде как и не требовалось... Выводится только средний балл кандидата на отчисление.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 78
Пол: Женский

Репутация: -  0  +


В смысле запрос не учитывает тех, у кого оценки=null, т.е. первых кадидатов на отчисление.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






А, я кажется понял... Ты имела в виду выводить ИЛИ тех у кого средняя оценка меньше 40, ИЛИ тех у кого посещаемость ниже 30% smile.gif Мой запрос выводит только тех, у кого И одно И другое условие выполняются одновременно... Поменяй AND на OR, если надо выводить человека с низкой посещаемостью, даже если у него очень высокие баллы... И наоборот.

(напомнило историю про Милуоки и Коннектикут, однажды менеджер обратился к программисту с жалобой, что программа написана неправильно... "Вот, смотри, я ввожу найти клиентов из штатов Милуоки AND Коннектикут, база данных отвечает, что таких клиентов нет!!! А я точно знаю, что у нас есть пользователи и в одном и в другом штате!!!"... На что программист ответил: "Да, но они же не проживают в двух штатах одновременно... Попробуем Милуоки OR Коннектикут...")
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 78
Пол: Женский

Репутация: -  0  +


Нетsmile.gif, я имела ввиду, что даже если оставить одно условие Avg(Grades.Grade))<"40", то будут выводиться те у кого оценка от 0 до 39, а те у кого все оценки = null выводиться не будут, а если я прописываю в условии,
Avg(Grades.Grade))=null, то все равно те у кого оценка = null не выводятсяsad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Ясно, тебе просто нужно ,чтобы 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, если в ячейке ничего нет, и тогда все подсчитывается правильно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 78
Пол: Женский

Репутация: -  0  +


Спасибо большое!
А в MS SQL 2008 есть аналогичные функции? Или IIF надо через if else организовывать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
Или IIF надо через if else организовывать?
Нет, не через If/Else, насколько я помню, через CASE WHEN, что-то вроде:
avg(case when имя_поля is null then 0 else имя_поля end)
, но лучше все-таки посмотри в доках как записывается эта конструкция, мне просто проверить негде...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 78
Пол: Женский

Репутация: -  0  +


volvo , ещё раз огромное спасибо!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.05.2024 12:42
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name