Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2010, 16:49   #1
Jene4ka
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 75
По умолчанию SQL запрос. вывести студентов,которые НЕ оплатили обучение за определенный семестр

Здравствуйте!
Приложение делфи и аксесс.Есть две таблицы: студенты и контракты.В таблице контракты - курс и семестр обучения,соответственно связь с конкретным студентом в таблице студенты.
Необходимо написать такой запрос, чтобы вывести студентов,которые НЕ оплатили обучение за определенный семестр.
Как вывести тех, кто оплатил, понятно, а вот наоборот- не знаю.
Заранее спасибо!
Jene4ka вне форума Ответить с цитированием
Старый 17.05.2010, 17:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как вывести тех, кто оплатил, понятно
Ну вот там будет обратное условие )
Покажи запрос тех кто оплатил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.05.2010, 17:52   #3
Jene4ka
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 75
По умолчанию

select *
from student inner join kontrakt on student.id_st=kontrakt.id_st
where student.kontrakt=true and kontrakt.kurs= :kurs and kontrakt.semestr= :semestr;

Это параметрический запрос,чтоб вывести тех,кто оплатил
Jene4ka вне форума Ответить с цитированием
Старый 17.05.2010, 18:37   #4
Dark_Spirit
Форумчанин
 
Аватар для Dark_Spirit
 
Регистрация: 05.02.2009
Сообщений: 324
По умолчанию

если я правильно понял
Цитата:
select *
from student inner join kontrakt on student.id_st=kontrakt.id_st
where student.kontrakt=true and kontrakt.kurs= :kurs and kontrakt.semestr= :semestr;
наведённый выше запрос выведет всех кто платил определённого курса и за определённый семестр
тогда если запрос изменить таким образом:
Код:
select *
from student inner join kontrakt on student.id_st=kontrakt.id_st
where student.kontrakt=false and kontrakt.kurs= :kurs and kontrakt.semestr= :semestr;
выведет всех кто не заплатил за определённый курс и за определённый семестр, а если нужно всех кто не заплатил, тада:
Код:
select *
from student inner join kontrakt on student.id_st=kontrakt.id_st
where student.kontrakt=false;
Тяжело быть бестолковым.....
Dark_Spirit вне форума Ответить с цитированием
Старый 17.05.2010, 18:43   #5
Jene4ka
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 75
По умолчанию

нет,не так)
поле kontrakt в таблице студент просто указывает на то, что студент учится на контракте.
Вся информация об оплате уже содержится в таблице контракт.
Поэтому этот код:
select *
from student inner join kontrakt on student.id_st=kontrakt.id_st
where student.kontrakt=false and kontrakt.kurs= :kurs and kontrakt.semestr= :semestr;

вообще ничего не выведет, поскольку это бюджетники и, конечно, контракт они не оплачивали.
Поле student.kontrakt должно быть по-любому true
Jene4ka вне форума Ответить с цитированием
Старый 17.05.2010, 18:53   #6
Dark_Spirit
Форумчанин
 
Аватар для Dark_Spirit
 
Регистрация: 05.02.2009
Сообщений: 324
По умолчанию

а не проще ввести ещё одно поле в таблицу kontract в котором бы отмечалось платил студент за определённый курс или нет
Тяжело быть бестолковым.....
Dark_Spirit вне форума Ответить с цитированием
Старый 17.05.2010, 19:14   #7
Jene4ka
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 75
По умолчанию

ну тогда придется создавать полей 8, потому что учеба 4 года ,платить по семестрам)
Jene4ka вне форума Ответить с цитированием
Старый 17.05.2010, 19:26   #8
Dark_Spirit
Форумчанин
 
Аватар для Dark_Spirit
 
Регистрация: 05.02.2009
Сообщений: 324
По умолчанию

нет, тогда для каждого контрактника в таблице конракт будет 8 записей, если он всё вовремя заплатил и закончил учёбу. например:

1 курс 1 семестр заплатил
1 курс 2 семестр заплатил
................................... ..........
4 курс 2 семест заплатил
Тяжело быть бестолковым.....
Dark_Spirit вне форума Ответить с цитированием
Старый 17.05.2010, 19:30   #9
Jene4ka
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 75
По умолчанию

и как эти записи там появятся? вручную что ли создавать на все 4 курса для каждого?
Jene4ka вне форума Ответить с цитированием
Старый 17.05.2010, 20:44   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если я правильно понял, чтобы найти неоплативших студентов достаточен такой запрос:
Код:
select * from student 
  where student.kontrakt=true
      and student.id_st not in
     (select kontrakt.id_st from kontrakt
         where kontrakt.kurs= :kurs 
           and  kontrakt.semestr= :semestr);
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести на экран номера всех элементов, которые не делятся на 7 wrangler Общие вопросы C/C++ 5 10.12.2009 15:37
:'( вывести даты которые прошли... Julia_Lisha SQL, базы данных 1 17.05.2009 13:44
Из чисел 1, 1+ 1/2, 1+1/2+1/3 , … вывести на экран те, которые меньше а. umiko Microsoft Office Excel 1 16.05.2009 08:29
Рассортировать по возрастанию и вывести на печать список студентов. Sergeo_89 Фриланс 6 09.12.2008 13:51