Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 10
1

использование функции МАХ

08.08.2011, 00:28. Показов 658. Ответов 8
Метки нет (Все метки)

Здравствуйте!!!
Вопрос по DELPHI
Подскажите кто может, никак не могу понять что сделать в такой ситуации...

Есть две таблицы.
1. Основная - Osnova имеет поля ID*, f1,f2,f3...
2. Подчиненная - Status имеет поля ID*, status, datastatus, IDosnova
где Оsnova.ID=Status.IDosnova
Для каждого Оsnova.ID может быть несколько статусов с разными датами. Приблизительно вот так:

Status

ID*, status, datastatus, IDosnova
76 передано 27.06.2011 134
77 сдано 13.05.2011 134
78 возврат 14.09.2010 135
79 сдано 15.07.2011 135


Необходимо сделать такую выборку что бы остались для каждого IDosnova
только последние по дате значения.т.е.

ID*, status, datastatus, IDosnova
76 передано 27.06.2011 134
79 сдано 15.07.2011 135

Это я сделал вот так (но только для двух полей datastatus, IDosnova):
SQL
1
2
3
SELECT STATUS.IDosnova, MAX(STATUS.Datastatus)
FROM STATUS
GROUP BY STATUS.IDosnova
Но кроме
status.IDosnova, status.datastatus надо еще выбрать несколько полей, например status.status, как это сделать?!?!?!? Так если добавить поле оно выдаст все значения...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2011, 00:28
Ответы с готовыми решениями:

использование функции ShellExecute
Привет всем. для запуска ехе -ника использую ShellExecute но дела в том что файл который я запускаю...

Использование функции через Edit
Здраствуйте. Подскажите пожалуйста, можно ли (и если да, то как?)сделать так: Я ввожу в Edit1...

Использование функции Iif в форме
Дорогие форумчане! Прошу помощи) буду очень признательна и благодарна если поможете решить мою...

Использование функции Iif (аксесс)
Подскажите что сделано неправильно?(

8
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
08.08.2011, 10:22 2
Решить можно так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
  st2.idosnova,
  st2.datestatus,
  st2.status
FROM
  (
  SELECT st.idosnova, MAX(st.datestatus)
  FROM STATUS st
  GROUP BY st.idosnova
  ) st1,
  STATUS st2
WHERE
  st1.idosnova = st2.idosnova
  AND st1.datestatus = st2.datestatus
;
Если надо установить связь с таблицей osnova, тогда так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT
  osn.idosnova,
  osn.f1,
  osn.f2,
  osn.f3,
  st2.datestatus,
  st2.status
FROM
  osnova osn,
  (
  SELECT st.idosnova, MAX(st.datestatus)
  FROM STATUS st
  GROUP BY st.idosnova
  ) st1,
  STATUS st2
WHERE
  osn.idosnova = st1.idosnova
  AND st1.idosnova = st2.idosnova
  AND st1.datestatus = st2.datestatus
;
---
Здесь я написал datestatus, а не datastatus, т. к., дата в английском языке пишется так: date. А данные обозначаются словом: data.
0
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 10
08.08.2011, 16:53  [ТС] 3
хм... выдает ошибку на SELECT который расположен после FROM!

Добавлено через 2 минуты
ошибка - invalid use of keyword
0
19 / 19 / 0
Регистрация: 22.07.2011
Сообщений: 68
08.08.2011, 18:17 4
ты написал GROUP BY и не понял, зачем?
Смысл функции в том, чтобы для каждого из значений поля, по которому мы группируем, было не более одной записи
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
08.08.2011, 22:35 5
ximera370, такие вложенные запросы будут работать на СУБД с развитым SQL движком. - Это клиент-серверные СУБД: Oracle, SQL Server, IBM DB2, Interbase, Sybase и пр. Возможно заработает на Access. Если в качестве БД используется Paradox, DBase и прочие такие БД - для них SQL движок реализуется на уровне драйверов доступа. Там такой запрос может не заработать.
---
Можно ещё попробовать во вложенном запросе дать псевдоним для агрегируемого поля:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
  st2.idosnova,
  st2.datestatus,
  st2.STATUS
FROM
  (
  SELECT st.idosnova, MAX(st.datestatus) datestatus
  FROM STATUS st
  GROUP BY st.idosnova
  ) st1,
  STATUS st2
WHERE
  st1.idosnova = st2.idosnova
  AND st1.datestatus = st2.datestatus
;
0
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 10
09.08.2011, 00:17  [ТС] 6
to Mawrat я к сожалению использую Paradox. и в последнем примере таже беда, после from select не катит!!! Неужели никак нельзя это обойти, вроде не така сложная задача. может есть альтернатива как выбрать такой запрос?может как то через временные таблицы можно?
to Antervis не понял смысл, что Вы имели ввиду про group by?
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
09.08.2011, 00:41 7
Цитата Сообщение от ximera370 Посмотреть сообщение
может как то через временные таблицы можно?
Если такой вариант приемлем, тогда так:
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
--Q1. Выполняется один раз.
CREATE TABLE TableTemp(
  id INTEGER,
  datestatus DATE
);
 
--Q2.
DELETE FROM TableTemp;
 
--Q3.
INSERT INTO TableTemp (id, datestatus)
SELECT st.idosnova, MAX(st.datestatus)
FROM STATUS st
GROUP BY st.idosnova
;
 
--Q4. Перед выполнением этого запроса следует выполнить запросы Q2 и Q3 - в случае, если
--данные в таблице STATUS обновились. Или в случае, если запрос Q4 выполняется впервые.
SELECT
  st2.idosnova,
  st2.datestatus,
  st2.STATUS
FROM
  TableTemp st1,
  STATUS st2
WHERE
  st1.idosnova = st2.idosnova
  AND st1.datestatus = st2.datestatus
;
0
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 10
09.08.2011, 00:51  [ТС] 8
ага, это интересно! завтра попробую все и отпишусь!
0
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 10
09.08.2011, 18:44  [ТС] 9
Да, все получилось, как раз то что я хотел. Большое Вам спасибо Mawrat!!! Из пяти форумов на которых я задавал этот вопрос Вы единственный кто наставил меня на путь истинный!!!!

---
Mawrat: Пожалуйста.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2011, 18:44

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Числовой и текстовый запрос в 1 мах
Народ кто подскажет как можно в 1 запросе сразу исползывать и числовые поля и текстовые? То в моем...

Использование стандартных компонент в приложении вычисления функции
Создать приложение с заданным количеством страниц диалога (закладками). 1. Первая страница ...

МАХ значение функции
Помогите, пожалуйста, сделать максимальное значение:wall: Если вдруг увидите другие ошибки, то...

Цикл на нахождение Мин и Мах функции
Найти наибольшее и наименьшее значения функции в заданном интервале с заданным шагом: Функция ...


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

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

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