![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Triplet |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 78 Пол: Женский Репутация: ![]() ![]() ![]() |
Здравствуйте.
Помогите, пожалуйста, написать вложенный запрос на sql. Есть таблица Student с полем ФИО,ID, есть таблица Оценки, т.е. по определённому заданию своя оценка (в процентах) и есть таблица Посещаемость. На отчисление выводятся те, у кого средний балл меньше 40% и посещаемость <30%. Я sql начала изучать совсем недавно, могу написать только тривиальный select, так что извиняюсь, если вопрос дурацкий ![]() Заранее спасибо! |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Если у тебя в таблице Оценки хранится несколько оценок для каждого студента по разным предметам, и надо из них для этого студента вычислить среднюю, а в таблице Посещаемость ничего подсчитывать не надо (там уже готовые к обработке данные) - то вот это работает для MS Access SQL:
SQL SELECT Student.FIO, P.percent, Avg(Grades.Grade) AS AverageGrade (P - таблица посещаемости, данные хранятся поле percent; Grades - таблица оценок, в поле Student - ID студента, в поле Grade - оценка по какому-то предмету, в поле Subj - хотя это неважно - название предмета)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")); Если надо делать какие-то подсчеты и в Посещаемости - уточняй структуру этой таблицы... |
Triplet |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 78 Пол: Женский Репутация: ![]() ![]() ![]() |
Спасибо большое!
Только запрос не выводит оценки равные null (тип оценки int), Пробовала дописать так (Grades.Grade)=null), но ничего не выводится. Или не должно выводиться? Пока по посещаемости подсчётов не надо, потом будет задание высчитывать посещаемость(на каждое занятие стоит флаг, если студент был, то true, если нет, то false) и надо будет посчитать кол-во всех true. Сообщение отредактировано: Triplet - 14.12.2008 16:42 |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Только запрос не выводит оценки равные null Так запрос вообще не выводит никакие оценки, это вроде как и не требовалось... Выводится только средний балл кандидата на отчисление. |
Triplet |
![]()
Сообщение
#5
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 78 Пол: Женский Репутация: ![]() ![]() ![]() |
В смысле запрос не учитывает тех, у кого оценки=null, т.е. первых кадидатов на отчисление.
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
А, я кажется понял... Ты имела в виду выводить ИЛИ тех у кого средняя оценка меньше 40, ИЛИ тех у кого посещаемость ниже 30%
![]() (напомнило историю про Милуоки и Коннектикут, однажды менеджер обратился к программисту с жалобой, что программа написана неправильно... "Вот, смотри, я ввожу найти клиентов из штатов Милуоки AND Коннектикут, база данных отвечает, что таких клиентов нет!!! А я точно знаю, что у нас есть пользователи и в одном и в другом штате!!!"... На что программист ответил: "Да, но они же не проживают в двух штатах одновременно... Попробуем Милуоки OR Коннектикут...") |
Triplet |
![]()
Сообщение
#7
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 78 Пол: Женский Репутация: ![]() ![]() ![]() |
Нет
![]() Avg(Grades.Grade))=null, то все равно те у кого оценка = null не выводятся ![]() |
volvo |
![]()
Сообщение
#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, если в ячейке ничего нет, и тогда все подсчитывается правильно... |
Triplet |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 78 Пол: Женский Репутация: ![]() ![]() ![]() |
Спасибо большое!
А в MS SQL 2008 есть аналогичные функции? Или IIF надо через if else организовывать? |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата Или IIF надо через if else организовывать? Нет, не через If/Else, насколько я помню, через CASE WHEN, что-то вроде:avg(case when имя_поля is null then 0 else имя_поля end) , но лучше все-таки посмотри в доках как записывается эта конструкция, мне просто проверить негде... |
Triplet |
![]()
Сообщение
#11
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 78 Пол: Женский Репутация: ![]() ![]() ![]() |
volvo , ещё раз огромное спасибо!!!
|
![]() ![]() |
![]() |
Текстовая версия | 13.08.2025 19:02 |