Форум программистов, компьютерный форум, киберфорум
Наши страницы
Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
1

SQL запросы

30.03.2010, 10:07. Просмотров 1581. Ответов 13
Метки нет (Все метки)

Помогите записать запрос.

У меня есть три таблицы:

Таблица ProhodnoyBall (Проходной балл) с полями Spec (Специальность) и Ball (Проходной балл)
Таблица Abiturient (Поступающие абитуриенты) со следующими полями:
CodFIOAbiturSvedeniya (ФИО абитуриента), CodFakultet (Факультет), CodSpecialnost (Специальность)
Таблица Ocenki (Оценки) с полями:
CodAbitur (ФИО абитуриента)
CodPredmet (Предмет)
Ocenka (Оценка)

Я написала следующий запрос:

SQL
1
2
3
4
5
6
7
8
9
SELECT Abiturient.CodFIOAbiturSvedeniya, Abiturient.CodFakultet,  Abiturient.CodSpecialnost, SUM(Ocenki.Ocenka)*100/20 AS SummaBall
FROM  Abiturient, ProhodnoyBall, Ocenki, Predmet, Fakultet, Specialnost
WHERE
(Predmet.Name = Ocenki.CodPredmet)
  AND (Abiturient.CodFIOAbiturSvedeniya = Ocenki.CodAbitur) AND
 (Abiturient.CodSpecialnost = ProhodnoyBall.Specialnost)
  AND (ProhodnoyBall.Ball > SummaBall)
    GROUP BY
  Abiturient.CodFIOAbiturSvedeniya
Не работает. Что не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2010, 10:07
Ответы с готовыми решениями:

запросы SQL
Помогите реализовать запросы ! 1 Получить перечень и общее число пилотов, не...

SQL-запросы
Схема БД состоит из четырех отношений: 1.Поставщики (Hомеp...

Запросы SQL
Прошу помочь в решении данных вариантов задач:  Получить номера деталей,...

SQL запросы
SQL запросы Доброго времени суток. Подскажите как реализовать запрос,...

Запросы SQL
Есть такая база данных create database Автозапчасти; use Автозапчасти;...

13
unick12345
1781 / 1113 / 179
Регистрация: 27.03.2009
Сообщений: 4,256
30.03.2010, 10:23 2
говоришь 3 таблицы а используешь
Abiturient, ProhodnoyBall, Ocenki, Predmet, Fakultet, Specialnost=6
и немного запутано както. какие поля у остальных таблиц?
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
30.03.2010, 10:53  [ТС] 3
Остальные таблицы используются при вычислении суммы баллов

Добавлено через 27 секунд
А суть понятна?
0
Mawrat
12830 / 5738 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
30.03.2010, 12:10 4
Список в разделе Group by должен соответствовать списку в Select. - Т. е. в GroupBy должны быть те же поля, что и в Select, исключая агрегации. Агрегации - это поля, образованные вызовом агрегатных функций: Sum(), Avg(), Count(), Min(), Max() и пр.
Т. е. Group by в приведённом запросе должен быть таким:
SQL
1
2
3
4
5
6
...
GROUP BY
  Abiturient.CodFIOAbiturSvedeniya,
  Abiturient.CodFakultet, 
  Abiturient.CodSpecialnost
;
Если исправить запрос таким образом, он скорее всего заработает. Но данные будет выдавать неверные. Потому что в разделе where не задана связь с таблицами: ProhodnoyBall, Predmet, Fakultet. Это означает, что они окажутся подключены через полное внешнее объединение - т. е. если там записей много, то будет что-то ужасное. Надо обязательно связать эти таблицы через какие-то поля.
---

<Mawrat: Тему переношу в раздел "Базы данных".>
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
30.03.2010, 12:52  [ТС] 5
Mawrat, Спасибо, сейчас попробую

Добавлено через 40 минут
Сделала так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT Abiturient.CodFIOAbiturSvedeniya, Abiturient.CodFakultet,
       Abiturient.CodSpecialnost, SUM(Ocenki.Ocenka)*100/20 AS SummaBall
FROM Abiturient, ProhodnoyBall, Ocenki, Predmet, Fakultet, Specialnost, Svedeniya
WHERE
      (Predmet.Name = Ocenki.CodPredmet)
  AND (Abiturient.CodFIOAbiturSvedeniya = Ocenki.CodAbitur) 
  AND (Abiturient.CodSpecialnost = ProhodnoyBall.Spec)
  AND (ProhodnoyBall.Ball > SummaBall)
  AND (Fakultet.Name = Abiturient.CodFakultet)
  AND (Specialnost.Name = Abiturient.CodSpecialnost)
  AND (Svedeniya.FIOAbitur = Abiturient.CodFIOAbiturSvedeniya)
  AND (Predmet.Name = Ocenki.CodPredmet)
  AND (Svedeniya.FIOAbitur = Ocenki.CodAbitur)
GROUP BY
  Abiturient.CodFIOAbiturSvedeniya,
  Abiturient.CodFakultet, 
  Abiturient.CodSpecialnost
Ошибки не выводит, но и информации тоже нет.
0
unick12345
1781 / 1113 / 179
Регистрация: 27.03.2009
Сообщений: 4,256
30.03.2010, 13:24 6
какая база? SQL или Access?

Добавлено через 48 секунд
хочу посмотреть параметры таблиц (поля и взаимосвязи)

Добавлено через 1 минуту
хотя... в данном случае если запрос выводит данные только из 2 таблиц, то связи с остальными не нужны. они и конфликтуют. или измени запрос на вывод информации и из остальных таблиц
0
Mawrat
12830 / 5738 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
30.03.2010, 13:43 7
Для начала надо выполнить такие запросы:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
--Подсчитывает сумму оценок по данном абитуриенту. В эту сумму войдут
--все оценки по всем предметам.
SELECT Abiturient.CodFIOAbiturSvedeniya, Abiturient.CodFakultet,
       Abiturient.CodSpecialnost, SUM(Ocenki.Ocenka)*100/20 AS SummaBall
FROM Abiturient, Ocenki
WHERE
      Abiturient.CodFIOAbiturSvedeniya = Ocenki.CodAbitur
GROUP BY
  Abiturient.CodFIOAbiturSvedeniya,
  Abiturient.CodFakultet, 
  Abiturient.CodSpecialnost
;
Если за основу берём этот запрос, то таблица Predmet не понадобится.
---
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
--Подсчитывает сумму оценок по данном абитуриенту раздельно по разным предметам.
SELECT Abiturient.CodFIOAbiturSvedeniya, Abiturient.CodFakultet,
       Abiturient.CodSpecialnost, Ocenki.CodPredmet, SUM(Ocenki.Ocenka)*100/20 AS SummaBall
FROM Abiturient, Ocenki, Predmet
WHERE
      Abiturient.CodFIOAbiturSvedeniya = Ocenki.CodAbitur
      AND Ocenki.CodPredmet = Predmet.Name
GROUP BY
  Abiturient.CodFIOAbiturSvedeniya,
  Abiturient.CodFakultet, 
  Abiturient.CodSpecialnost,
  Ocenki.CodPredmet
;
Здесь таблица Predmet нужна.
Сразу вопрос возникает:
Ocenki.CodPredmet = Predmet.Name
Может так надо?:
Ocenki.CodPredmet = Predmet.Cod
---
Если нужный нам базовый запрос отработал правильно, тогда начинаем подключать по одной следующие таблицы. После подключения каждой таблицы проверяем, как запрос выполняется. Если при подключении очередной таблицы данные перестали показываться или результаты неверные, тогда надо разбираться со связями и данными именно этой вновь подключенной таблицы.
---
Возможно, таблицу Ocenki можно связать с таблицей Abiturient только через таблицу Svedenia. Тогда запросы, представленные выше, надо подправить.
---
Unick12345, прав - хорошо бы видеть связи между таблицами.
1
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
31.03.2010, 08:17  [ТС] 8
Mawrat, Я сделала следующий запрос, который выводит на отдельную форму в таблицу DBGrid ФИО абитуриента и сумму баллов:
SQL
1
2
3
4
5
6
7
8
9
SELECT
  Abiturient.CodFIOAbiturSvedeniya, SUM(Ocenki.Ocenka)*100/20 AS SummaBall
FROM
  Abiturient, Ocenki, Predmet
WHERE
 (Predmet.Name = Ocenki.CodPredmet)
  AND (Abiturient.CodFIOAbiturSvedeniya = Ocenki.CodAbitur)
GROUP BY
  Abiturient.CodFIOAbiturSvedeniya
Также у меня есть таблица ProhodnoyBall созданная в Access с полями специальность (Spec) и проходной балл (Ball)

Есть таблица Svedeniya содержит много полей из них: FIOAbitur и Zachislen

Есть таблица Abiturient (Поступающие) которая содержит поля:
CodFIOAbiturSvedeniya (текстовое поле содержит ФИО абитуриента)
CodSpecialnost (текстовое поле содержит специальность на которую абитуриент постпупает)
CodFakultet (текстовое поле содержит факультет на которую абитуриент постпупает)


Мне нужно чтобы при нажатии на кнопку выполнялся следующий запрос (напишу на Паскале):
if (Abiturient.CodSpecialnost = ProhodnoyBall.Spec) and (Abiturient.CodFIOAbiturSvedeniya = Svedeniya.FIOAbitur) and (SummaBall > ProhodnoyBall.Ball) then
Svedeniay.Zachislen:=True;

Вот как то так
0
Mawrat
12830 / 5738 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
31.03.2010, 11:50 9
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
--Решение этой задачи можно разбить на 2 подзадачи, каждая из которых может быть представлена запросом:
 
--Запрос показывает абитуриентов, специальности на которые они поступают
--и проходной бал, который им необходимо набрать, чтобы поступить на эту специальность.
SELECT
  Ab.CodFIOAbiturSvedeniya
  ,Ab.CodSpecialnost
  ,Prb.Ball
FROM
  Abiturient Ab
  ,ProhodnoyBall Prb
WHERE
  Ab.CodSpecialnost = Prb.Spec
;
 
--Запрос подсчитывает сумму балов по каждому абитуриенту.
--В эту сумму входят все балы, набранные в по всем предметам.
SELECT
  Ab.CodFIOAbiturSvedeniya
  ,SUM(Oc.Ocenka) AS SumBall
FROM
  Abiturient Ab
  ,Ocenki Oc
WHERE
  Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
GROUP BY
  Ab.CodFIOAbiturSvedeniya
;
 
--Чтобы решить нашу задачу, надо использовать оба этих запроса совместно.
--Здесь можно использовать 2 способа:
 
--1. Запрос, построенный этим способом первоначально кажется более компактным.
--Но при дальнейшем добавлении в него таблиц и соответственно новых полей
--в раздел Select необходимо также добавлять поля в раздел Group by. При этом
--надо следить за тем, чтобы не нарушился диапазон группировки (агрегации).
--Т. е. все подключаемые в дальнейшем таблицы должны быть связаны (прямо или косвенно)
--с таблицей Abiturient отношением типа: "один - к одному". 
SELECT
  Ab.CodFIOAbiturSvedeniya
  ,Ab.CodSpecialnost
  ,Prb.Ball
  ,SUM(Oc.Ocenka) AS SumBall
  ,CASE
    WHEN SUM(Oc.Ocenka) >= Prb.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
FROM
  Abiturient Ab
  ,ProhodnoyBall Prb
  ,Ocenki Oc
WHERE
  Ab.CodSpecialnost = Prb.Spec
        Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
GROUP BY
  Ab.CodFIOAbiturSvedeniya
  ,Ab.CodSpecialnost
  ,Prb.Ball
;
 
--2.
--Запрос построенный этим способом первоначально, как бы, несколько сложнее
--предыдущего варианта. Но при добавлении новых таблиц и полей в него не надо заботиться
--о разделе Group by - этот раздел расположен во вложенном запросе и изменять его не надо.
--Т. е. вложенный запрос изолирует задачу агрегации от других данных.
--Поэтому можно не беспокоиться о возможном изменении диапазона группировки - такое просто
--в данном случае не произойдёт. При добавлении новых таблиц, в результирующий
--набор могут попасть какие-то дополнительные строки, но на диапазон агрегации они
--не повлияют и подсчитанные суммы баллов по абитуриентам останутся всё равно верными.
SELECT
  Ab.CodFIOAbiturSvedeniya
  ,Ab.CodSpecialnost
  ,Prb.Ball
  ,SumBall.SumBall
  ,CASE
    WHEN SumBall.SumBall >= Prb.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
FROM
  Abiturient Ab
  ,ProhodnoyBall Prb
  ,(
    SELECT
      Ab.CodFIOAbiturSvedeniya
      ,SUM(Oc.Ocenka) AS SumBall
    FROM
      Abiturient
      ,Ocenki
    WHERE
      Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
    GROUP BY
      Ab.CodFIOAbiturSvedeniya,
  ) SumBall
WHERE
  Ab.CodSpecialnost = Prb.Spec
  Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
;
 
--На этом этапе надо добиться того, чтобы запрос по методу 1 или 2 заработал
--и выдал верные результаты.
--Дальше уже можно добавлять в запрос дополнительные таблицы.
Если требуется, можно заменить:
SQL
1
2
3
4
5
6
...
  ,CASE
    WHEN SUM(Oc.Ocenka) >= Prb.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
...
На:
SQL
1
2
3
4
5
6
...
  ,CASE
    WHEN SUM(Oc.Ocenka) >= Prb.Ball THEN 1
    ELSE 0
  END AS RESULT
...
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
31.03.2010, 12:12  [ТС] 10
Mawrat, Спасибо, буду пробовать.

Добавлено через 17 минут
Mawrat, Сделала так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT
  Abiturient.CodFIOAbiturSvedeniya
  ,Abiturient.CodSpecialnost
  ,ProhodnoyBall.Ball
  ,SumBall.SumBall
  CASE
    WHEN SummaBall.SummaBall >= ProhodnoyBall.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
FROM
  Abiturient
  ,ProhodnoyBall
  ,(
    SELECT
      Abiturient.CodFIOAbiturSvedeniya
      ,SUM(Ocenki.Ocenka) AS SummaBall
    FROM
      Abiturient
      ,Ocenki
    WHERE
      Abiturient.CodFIOAbiturSvedeniya = Ocenki.CodAbitur
    GROUP BY
      Abiturient.CodFIOAbiturSvedeniya,
  ) SummaBall
WHERE
  Abiturient.CodSpecialnost = ProhodnoyBall.Spec
  Abiturient.CodFIOAbiturSvedeniya = SummaBall.CodFIOAbiturSvedeniya
Выходит сообщение: "Неопознанная ошибка". Что не так?
0
Mawrat
12830 / 5738 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
31.03.2010, 12:16 11
Для загрузки или обновления данных в таблице Svedenia можно использовать зарпосы:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
--Для загрузки данных в таблицу Svedenia, действовать можно так
--(на базе второго варианта запроса): 
 
INSERT INTO Svedenia (FIOAbitur, Zachislen)
SELECT
  Ab.CodFIOAbiturSvedeniya
  ,CASE
    WHEN SumBall.SumBall >= Prb.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
FROM
  Abiturient Ab
  ,ProhodnoyBall Prb
  ,(
    SELECT
      Ab.CodFIOAbiturSvedeniya
      ,SUM(Oc.Ocenka) AS SumBall
    FROM
      Abiturient
      ,Ocenki
    WHERE
      Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
    GROUP BY
      Ab.CodFIOAbiturSvedeniya,
  ) SumBall
WHERE
  Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
;
 
--Запрос для обновления данных:
 
UPDATE Svedenia Sv SET Zachislen =
(
SELECT
  CASE
    WHEN SumBall.SumBall >= Prb.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
FROM
  Abiturient Ab
  ,ProhodnoyBall Prb
  ,(
    SELECT
      Ab.CodFIOAbiturSvedeniya
      ,SUM(Oc.Ocenka) AS SumBall
    FROM
      Abiturient
      ,Ocenki
    WHERE
      Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
    GROUP BY
      Ab.CodFIOAbiturSvedeniya,
  ) SumBall
WHERE
  Ab.CodFIOAbiturSvedeniya = Sv.FIOAbitur 
  AND Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
);
---
В запросах из моего предыдущего поста в выражение where надо добавить "and":
SQL
1
2
3
4
5
6
7
8
9
10
11
--1...
...
WHERE
  Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
...
--2...
WHERE
  Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
...
---
Цитата Сообщение от AlenaIvanova Посмотреть сообщение
Выходит сообщение: "Неопознанная ошибка". Что не так?
Перед case отсутствует запятая. Надо дописать эту запятую.
SQL
1
2
3
4
5
6
7
8
9
10
SELECT
  Abiturient.CodFIOAbiturSvedeniya
  ,Abiturient.CodSpecialnost
  ,ProhodnoyBall.Ball
  ,SumBall.SumBall
  ,CASE
    WHEN SummaBall.SummaBall >= ProhodnoyBall.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
...
0
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
31.03.2010, 12:23  [ТС] 12
Делаю так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
UPDATE Svedenia Sv SET Zachislen =
(
SELECT
  CASE
    WHEN SumBall.SumBall >= Prb.Ball THEN TRUE
    ELSE FALSE
  END AS RESULT
FROM
  Abiturient Ab
  ,ProhodnoyBall Prb
  ,(
    SELECT
      Ab.CodFIOAbiturSvedeniya
      ,SUM(Oc.Ocenka) AS SumBall
    FROM
      Abiturient
      ,Ocenki
    WHERE
      Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
    GROUP BY
      Ab.CodFIOAbiturSvedeniya,
  ) SumBall
WHERE
  Ab.CodFIOAbiturSvedeniya = Sv.FIOAbitur 
  AND Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
);
Ошибка синтаксиса

Добавлено через 4 минуты
Мне как раз на обновления данных в таблице сведения надо, а запитую я специально убрала, думала что ошибка из-за нее
0
Mawrat
12830 / 5738 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
31.03.2010, 15:31 13
Я для проверки написал тестовый пример. База - Oracle, поэтому вместо true и false использовал, соответственно 1 и 0 (ноль). Имена таблиц у меня идут с префиксом "test_":
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--Структуры.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
 
--drop table test_abiturient;
 
CREATE TABLE test_abiturient (
  CodFIOAbiturSvedeniya      varchar2(100 CHAR)
  ,CodSpecialnost            varchar2(100 CHAR)
);
 
--------------------------------------------------------------------------------
 
--drop table test_ball;
 
CREATE TABLE test_ProhodnoyBall (
  spec       varchar2(100 CHAR)
  ,ball      INTEGER
);
 
--------------------------------------------------------------------------------
 
--drop table test_ocenki;
 
CREATE TABLE test_ocenki (
  CodAbitur      varchar2(100 CHAR)
  ,CodPredmet    varchar2(100 CHAR)
  ,Ocenka        INTEGER
);
 
--------------------------------------------------------------------------------
 
--drop table test_svedeniya;
 
CREATE TABLE test_svedeniya (
  FIOAbitur      varchar2(100 CHAR)
  ,Zachislen     INTEGER
);
 
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--Работа с данными.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
 
ROLLBACK;
 
DELETE FROM test_abiturient;
 
INSERT INTO test_abiturient (CodFIOAbiturSvedeniya, CodSpecialnost)
SELECT 'иван', 'spec1' FROM dual
UNION SELECT 'сергей', 'spec2' FROM dual
;
 
DELETE FROM test_ProhodnoyBall;
 
INSERT INTO test_ProhodnoyBall (spec, ball)
SELECT 'spec1', 16 FROM dual
UNION SELECT 'spec2', 18 FROM dual
;
 
DELETE FROM test_ocenki;
 
INSERT INTO test_ocenki (CodAbitur, CodPredmet, Ocenka)
SELECT 'иван', 'math', 10 FROM dual
UNION SELECT 'иван', 'phis', 6 FROM dual
UNION SELECT 'сергей', 'math', 9 FROM dual
UNION SELECT 'сергей', 'phis', 8 FROM dual
;
 
commit;
 
--Отрабатывает правильно: Иван - проходит, а Сергей - нет.
SELECT
  Ab.CodFIOAbiturSvedeniya
  ,CASE
    WHEN SumBall.SumBall >= Prb.Ball THEN 1
    ELSE 0
  END AS RESULT
FROM
  test_Abiturient Ab
  ,test_ProhodnoyBall Prb
  ,(
    SELECT
      Ab.CodFIOAbiturSvedeniya
      ,SUM(Oc.Ocenka) AS SumBall
    FROM
      test_Abiturient Ab
      ,test_Ocenki Oc
    WHERE
      Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
    GROUP BY
      Ab.CodFIOAbiturSvedeniya
  ) SumBall
WHERE
  Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
;
 
--Очищаем таблицу test_Svedeniya.
DELETE FROM test_Svedeniya;
 
--Повышаем бал Сергея по математике.
UPDATE test_ocenki SET Ocenka = 10
WHERE
  CodAbitur = 'сергей'
  AND CodPredmet = 'math'
;
 
--Добавление записей в test_Svedeniya.
INSERT INTO test_Svedeniya (FIOAbitur, Zachislen)
SELECT
  Ab.CodFIOAbiturSvedeniya
  ,CASE
    WHEN SumBall.SumBall >= Prb.Ball THEN 1
    ELSE 0
  END AS RESULT
FROM
  test_Abiturient Ab
  ,test_ProhodnoyBall Prb
  ,(
    SELECT
      Ab.CodFIOAbiturSvedeniya
      ,SUM(Oc.Ocenka) AS SumBall
    FROM
      test_Abiturient Ab
      ,test_Ocenki Oc
    WHERE
      Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
    GROUP BY
      Ab.CodFIOAbiturSvedeniya
  ) SumBall
WHERE
  Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
;
 
--Проверка: Сведения верные: Иван и Сергей - проходят.
SELECT * FROM test_Svedeniya;
 
--Понижаем бал Сергея по математике.
UPDATE test_ocenki SET Ocenka = 9
WHERE
  CodAbitur = 'сергей'
  AND CodPredmet = 'math'
;
 
--Обновление записей в test_Svedeniya.
UPDATE test_Svedeniya Sv SET Zachislen =
(
SELECT
  CASE
    WHEN SumBall.SumBall >= Prb.Ball THEN 1
    ELSE 0
  END AS RESULT
FROM
  test_Abiturient Ab
  ,test_ProhodnoyBall Prb
  ,(
    SELECT
      Ab.CodFIOAbiturSvedeniya
      ,SUM(Oc.Ocenka) AS SumBall
    FROM
      test_Abiturient Ab
      ,test_Ocenki Oc
    WHERE
      Ab.CodFIOAbiturSvedeniya = Oc.CodAbitur
    GROUP BY
      Ab.CodFIOAbiturSvedeniya
  ) SumBall
WHERE
  Ab.CodFIOAbiturSvedeniya = sv.FIOAbitur
  AND Ab.CodSpecialnost = Prb.Spec
  AND Ab.CodFIOAbiturSvedeniya = SumBall.CodFIOAbiturSvedeniya
);
 
--Проверка: Сведения верные: теперь Иван проходит, а Сергей - нет.
SELECT * FROM test_Svedeniya;
 
commit;
Все скрипты в этой реализации отрабатывают правильно.
Т. е. тебе сейчас нужно сравнить свои запросы с моими из этой реализации. Всё должно заработать. Особое внимание надо обратить на реальные имена полей и таблиц в твоей базе.
---
Если не получится - пиши.
2
AlenaIvanova
8 / 8 / 0
Регистрация: 24.02.2010
Сообщений: 175
05.04.2010, 12:19  [ТС] 14
Mawrat, Здравствуйте. Вы посмотрели мою базу?

<Mawrat: Да, проект посмотрел. Ответил здесь.>
0
05.04.2010, 12:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2010, 12:19

Не работают sql запросы
База данных «БАНК». Даны отношения, моделирующие работу банка и его...

Datasnap и sql запросы
Добрый день, делаю проект &quot;трехзвенку&quot; - (firebird - Datasnap - приложение...

Запросы с параметрами на SQL 7.0
Народ, помогите!!!! если пишу запрос в Query Analyzer: select top 20...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru