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

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

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2009, 13:26   #1
SEMEon
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 21
Сообщение SQL-запросы

помогите плиз!!! как сделать запрос, у меня есть БД с 3 связанными таблицами: группа=>студент=>оценки за экзамены. нужно чтоб в таблицы группа отражалось сколько человек сдали все экзамены и сколько человек не сдали все экзамены и средний бал???
SEMEon вне форума Ответить с цитированием
Старый 23.12.2009, 15:59   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы должны выложить пример БД (или, как минимум) описание связей.

и второе, сколько экзаменов всего? невозможно ответить на вопрос, сколько сдали ВСЕ экзамены, пока не будет известно, как опеределить по оценкам все ли экзамены сдал один конкретно взятый студент.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.12.2009, 06:33   #3
SEMEon
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 21
По умолчанию

Таблица группа состоит из полей: IDгруппы, Группа, Должны_сдавать, Сдали, Не_сдали, Средний_бал. Таблица студенты: IDстуденты, IDгруппы, ФИО, Дата_рождения, Место_жительство. Таблица оценки: IDоценки, IDстуденты, семестр, дата_сессии, дисциплина, вид_контроля, оценка.
Связи: IDгруппы(таблица Группа)=>IDгруппы(таблица Студенты), IDстуденты(таблица Студенты)=>IDстуденты(таблица Оценки).
SEMEon вне форума Ответить с цитированием
Старый 24.12.2009, 07:04   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

уже лучше!

Но. Ответа на ключевой вопрос не прозвучало!
или я плохо объясняю, или Вы меня не понимаете...
Как (по каким критериям) определить студентов, которые сдали ВСЕ экзамены?!!

на примере.
группа 1
студент Сидоров.
в оценках три записи:
Код:
семестр 1 21.10.2009 Культурология Экзамен 5
семестр 2 30.12.2009 Физика Экзамен 5
семестр 2 31.12.2009 сопромат Экзамен 4
вопрос 1. По какому семестру нас интересуют данные?
вопрос 2. Он все экзамены сдал?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.12.2009, 08:37   #5
SEMEon
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 21
По умолчанию

ну например в сессии было 5 экзаменов мат. анализ, физика, химия, статистика, философия. Если студент сдал все экзамены он заносится в таблицу Группа поле Все экзамены как 1 а если не сдал например физику то он заносится в поле что не сдал как 1, интересуют все студенты группы т.е. вот так должна выглядеть таблица Группы в зимний семестр 2008/2009

l№ группы l Должны l Сдали l Не сдали l Средний балл по l
l lсдавать чел.lсессию, чел.lсессию, чел. lрезультатам сессии l
lБК-7561 l 13 l 8 l 5 l 3,2 l
lБК-6561 l 16 l 14 l 2 l 3,5 l
lБК-5561 l 10 l 6 l 4 l 3,5 l
SEMEon вне форума Ответить с цитированием
Старый 24.12.2009, 09:15   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

понимаете, мы с Вами мыслим абсолютно в разных плоскостях...
поясню...
Цитата:
ну например в сессии было 5 экзаменов мат. анализ, физика, химия, статистика, философия.
допустим.. И где этот перечень хранится?!!!!!
я бы рекомендовал завести табличку:
Предметы, обязательные для сдачи в семестр
там дата семестра + предмет, который должен быть сдан

замечание 2.
Цитата:
Группы в зимний семестр 2008/2009
А где видно, что группы именно в зимний семестр?
Это, конечно, не очень критично - можно считать, что в таблице Группа всегда хранятся результаты последней сессии! но я бы всё равно рекомендовал завести поле - за какой семетры данные о сдаче экзамена... Хотя, если по хорошему, этим данным вообще не место в таблице Группы!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.12.2009, 15:26   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

у меня получился такой вариант на тех исходных данных, которые указаны (правда, не стал забивать такое кол-во студней и экзаменов с оценками - оставим это на совести ТС)

Код:
with 
  student_group as (
  select 1 group_id, 'БК-7561' group_name, 3 must_submit from dual union all
  select 2, 'БК-6561', 5 from dual union all
  select 3, 'БК-5561', 4 from dual
  ),
  
  students as (
  select 1 student_id, 1 group_id, 'Ivanov' FIO, to_date('01.03.1989', 'DD.MM.YYYY') birth_date, '' address from dual union all
  select 2, 1, 'Petrov', to_date('11.03.1989', 'DD.MM.YYYY'), '' from dual union all
  select 3, 1, 'Sidorov', to_date('18.03.1989', 'DD.MM.YYYY'), '' from dual union all
  select 4, 2, 'Pljushkin', to_date('11.04.1989', 'DD.MM.YYYY'), '' from dual union all
  select 5, 2, 'Petrakov', to_date('11.04.1989', 'DD.MM.YYYY'), '' from dual union all
  select 6, 2, 'Pushkin', to_date('11.04.1989', 'DD.MM.YYYY'), '' from dual union all
  select 7, 2, 'Ivanova', to_date('11.03.1989', 'DD.MM.YYYY'), '' from dual union all
  select 8, 2, 'Petrova', to_date('11.07.1989', 'DD.MM.YYYY'), '' from dual union all
  select 9, 3, 'Martov', to_date('11.03.1989', 'DD.MM.YYYY'), '' from dual union all
  select 10, 3, 'Glebov', to_date('11.09.1989', 'DD.MM.YYYY'), '' from dual union all
  select 11, 3, 'Sidorova', to_date('11.02.1989', 'DD.MM.YYYY'), '' from dual union all
  select 12, 3, 'Gordov', to_date('11.03.1989', 'DD.MM.YYYY'), '' from dual
  ),
  
  marks as (
  select 1 id, 1 student_id, 1 term_time, to_date('11.01.2009', 'DD.MM.YYYY') session_date, 'сопромат' article, 'Экзамен' type_control, 3 mark from dual union all
  select 2, 2, 1, to_date('11.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 2 from dual union all
  select 3, 3, 1, to_date('11.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 5 from dual union all
  select 4, 4, 1, to_date('08.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 3 from dual union all
  select 5, 5, 1, to_date('08.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 4 from dual union all
  select 6, 6, 1, to_date('08.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 5 from dual union all
  select 7, 7, 1, to_date('08.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 2 from dual union all
  select 8, 8, 1, to_date('08.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 3 from dual union all
  select 9, 9, 1, to_date('15.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 4 from dual union all
  select 10, 10, 1, to_date('15.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 2 from dual union all
  select 11, 11, 1, to_date('15.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 3 from dual union all
  select 12, 12, 1, to_date('15.01.2009', 'DD.MM.YYYY'), 'сопромат', 'Экзамен', 5 from dual union all
  select 13, 1, 1, to_date('08.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 3 from dual union all
  select 14, 2, 1, to_date('08.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 4 from dual union all
  select 15, 3, 1, to_date('08.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 5 from dual union all
  select 16, 4, 1, to_date('11.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 3 from dual union all
  select 17, 5, 1, to_date('11.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 4 from dual union all
  select 18, 6, 1, to_date('11.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 5 from dual union all
  select 19, 7, 1, to_date('11.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 3 from dual union all
  select 20, 8, 1, to_date('11.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 4 from dual union all
  select 21, 9, 1, to_date('02.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 5 from dual union all
  select 22, 10, 1, to_date('02.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 2 from dual union all
  select 23, 11, 1, to_date('02.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', 3 from dual union all
  select 24, 12, 1, to_date('02.01.2009', 'DD.MM.YYYY'), 'Физика', 'Экзамен', null from dual
  )

select
  sg.group_id,
  sg.group_name,
  sg.must_submit,  
  sum(case when m2.passed / m2.cnt_art = 1 then 1 else 0 end) passed,
  sum(case when m2.passed / m2.cnt_art = 1 then 0 else 1 end) not_passed,
  round(sum(m2.sum_mark / (m2.cnt_art * sg.must_submit)), 2) avg_mark
from(
      select        
        m.student_id,
        sum(m.mark) sum_mark,
        sum(case when m.mark > 2 then 1 else 0 end) passed,
        count(distinct m.article) cnt_art
      from marks m
      where 0=0  
        and m.session_date >= :p0 --to_date('30.12.2008', 'DD.MM.YYYY')
        and m.session_date < :p1 --to_date('25.01.2009', 'DD.MM.YYYY')
      group by m.student_id
  ) m2,
  student_group sg,
  students s
where 0=0
  and sg.group_id = s.group_id
  and s.student_id = m2.student_id
group by sg.group_id, sg.group_name, sg.must_submit
З.Ы.:в запросе указаны жесткие связи между таблицами и не учтен вариант, что если студент не пришел на экзамен, то и запись в табл. Оценки не попадет

Последний раз редактировалось soleil@mmc; 24.12.2009 в 15:28. Причина: добавочка
soleil@mmc вне форума Ответить с цитированием
Старый 24.12.2009, 19:58   #8
SEMEon
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 21
По умолчанию

Вобще как бы таблицу Группы можно поменять мне как я понял нужен запрос т.е. когда на кнопку нажимаешь задается введите дату сессии и тогда данные выводятся по группам сдувавшим сессию
SEMEon вне форума Ответить с цитированием
Старый 26.12.2009, 09:59   #9
SEMEon
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 21
По умолчанию

А вообще можно как нибудь в дочерней таблицы автоматический просчитать количество записей и чтоб они выводились в родительскую таблицу??? Если можно опишите поподробней пожалуйста
SEMEon вне форума Ответить с цитированием
Старый 26.12.2009, 11:04   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вообще, лучше такие вещи НЕ ДЕЛАТЬ!
Когда понадобится - всегда запросом можно легко получить количество (да и сами записи, при необходимости) из дочерней таблицы.

Ну, если уже делать, тогда "по правильному" такие вещи лучше делать на триггерах, которые вешаются на изменение/удаление/добавление записей в дочерней таблице....

Если же всё таки Вам НАДО это сделать через SQL (ну задание, например, такое учебное, не очень грамотное со стратегической точки зрения...), то это можно сделать примерно так:
Код:
update РодительскаяТаблица
  set ПолеКоличество_в_родительсткой_таблице =
    (select count(*) from ДочерняяТаблица where
           ДочерняяТаблица.КодСвязиСРодительской = 
                РодительскаяТаблица.УникальныйКод)
p.s. надеюсь, что я всё понятно "разжевал"...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL - запросы в Delphi zetrix БД в Delphi 41 08.06.2010 14:07
SQL запросы ArcaN0id Microsoft Office Access 6 13.12.2009 19:42
SQL запросы Best Programmist Microsoft Office Access 8 03.12.2009 16:42
Запросы на SQL denisk0 Microsoft Office Access 0 23.05.2009 16:05
sql запросы wolf950 БД в Delphi 2 28.11.2008 21:26