Помогите "чайнику "составить запрос

klubok
Дата: 19.09.2005 10:20:13
Доброе утро всем,

Продолжаю я тут составлять свою первую базу данных в Access, и возникла проблема не могу сделать вот, что:
Есть Таблица «План» (не трава), Есть таблица «Факт»,
В таблице План есть следующие Поля:
Номер контракта ‘много разных контрактов, дубликаты допускаются
Номер редакции ‘для каждого контракта может быть несколько редакций
Дата редакции
План_Деньги_1 ‘для каждой редакции – свои данные
План_Деньги_2
План_Деньги_3

В таблице Факт есть следующие поля:
Номер Контракта
Факт_Деньги_1
Факт_Деньги_2
Факт_Деньги_3

Известно, что самая последняя редакция Контракта в таблице План – это подписанная версия контракта.
Теперь необходимо сделать запрос (который дальше будет основой для формы), который берет последнюю редакцию для каждого контракта из таблицы План, берет фактические данные для каждого контракта из таблицы Факт и вычисляем баланс (расхождения).

Вроде ничего сложного. Но через МАХ у меня не получилось. Вернее, возвращает данные только для двух полей План.НомерКонтракта и План.НомерРедакции. А вот возвращать данные для остальных полей не хочет таблицы План соответствующих записи с последней редакцией контракта - не хочет. Если в запрос добавить еще одно поле, то ACCESS выдает ошибку, что поле не является частью функции.

Запрос писал такой:
SELECT PL.Contract, Max(PL.PLEd) AS MaxOfPLEd, PL.PLDate
FROM PL
GROUP BY PL.Contract;

Подскажите пожалуйста «чайнику», что делаю не так.
Rivkin Dmitry
Дата: 19.09.2005 10:46:58
Прежде чем вникать в сущность запроса, хочу отметить, что номер контракта обязан быть уникальным, иначе все вычисления будут не реальны! Поэтому, следует прежде всего поменять структуру БД, создать такую таблицу.В этой же таблице, мне кажется, можно будет прописать и окончательные значения контракта. Таблица редакций может в сущности повторить структуру первой таблицы с добавлением в ключ полей номера версии или даты.
Возможно, что в этом случае вопрос топика отпадет сам собой?
klubok
Дата: 19.09.2005 11:09:20
Так в том то и суть.
Даже после разделения таблиц (что пробывалось), - не отпадает вопрос выбора записи с параметром Максимальное_значение_редакции_Контракта из таблицы где для каждого контракта существует много редаций. Нужно для каждого контракта выбрать ОДНУ запись. Найти максимальное значение Редакции для каждого контракта - не проблема. А вот возвратить значения остальных полей данной записи в одном запросе - у меня не получается.

Какие только SQL запросы не пробовал - ничего не получается.
afaaffaaf
Дата: 19.09.2005 11:42:08
По поводу схемы данных. Если для некоего уникального экземпляра сущности("Факт") есть несколько экземпляров другого отношения ("План"), то это и есть отношения один-ко-многим. Стандартное решение - две таблицы, связанные по ключу.
По поводу запроса. Нужно сделать запрос, выводящий все нужные поля и выбрать нужные записи - либо объединить их в предложении From ( т.е. Inner Join), либо в предложении Where - варианты - In, Exists.
Евгений1234-5
Дата: 19.09.2005 12:06:23
Пишешь запрос который посто выбирает последнюю редакцию и номер контракта. Затем на базе другого запроса объеденяешь таблицу "План" с первым запосом по полям номер контракта и дата редакции. Запрос будет обновляемым.
Для начала так.

ЗЫ при условии что дата редакции не повторяется для контракта.
klubok
Дата: 19.09.2005 12:13:41
SELECT PL.Contract, PL.PLEd, PL.PLDate, PL.IS
FROM PL AS t INNER JOIN (SELECT PL.Contract, max(PL.PLEd) as PLEd, PLDate, PL.IS from PL
Group by PL.Contract) AS t1 ON (t.Contract = t1.Contract) AND (t.PLEd=t1.PLEd);



Вот это пробовал - не работает
klubok
Дата: 19.09.2005 12:32:03
Попробывал двумя запросами:

SELECT PL.Contract, Max(PL.PLEd) AS MaxOfPLEd
FROM PL
GROUP BY PL.Contract;


SELECT PL.Contract, MaxPLEd.MaxOfPLEd, PL.PLDate, PL.IS, PL.TS, PL.ES
FROM MaxPLEd INNER JOIN PL ON MaxPLEd.Contract=PL.Contract;

Все равно получается чушь.
Да максимальное значение редакции для каждого контракта первый запрос возвращает.

А вот второй запрос не работает.
Показывает следующее:

Контракт Редакция Дата Сумма
1226 27 16.03.2005 102
1226 27 23.03.2005 101
1226 27 29.03.2005 100

То есть пвозвращает значения ВСЕХ редакций, но номер самой редакции ставит максимальный для данного контракта.

Ответ тут конечно - один: Надо учить Мат.часть. Литература читается. Но сколько еще времени пройдет, пока я, балбес, пойму где "намудрил", пройдет много времени, а его как раз и не хватает.
klubok
Дата: 19.09.2005 12:35:55
фух.
получилось.

Подправил второй запрос.

SELECT PL.Contract, MaxPLEd.MaxOfPLEd, PL.PLDate, PL.[IS], PL.TS, PL.ES
FROM MaxPLEd INNER JOIN PL ON (MaxPLEd.Contract=PL.Contract) AND (MaxPLEd.MaxOfPLEd=PL.PLEd);

Всем спасибо за внимание.