Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как выбрать одну запись из группы???
 
 автор: 3750905   (23.12.2009 в 21:34)   личное сообщение
 
 

Есть таблица: дата, товар, склад, клиент.
Мне нужно в запросе получить последнюю запись по «дате» из группы «товар»
Если я выбираю из двух полей (товар и дата), то все получается

SELECT Общая.товар, Max(Общая.дата) AS [Max-дата]
FROM Общая
GROUP BY Общая.товар;

Но как только я добавляю третье поле, группировка добавляет новые строки.
Как получить в запросе все четыре поля, но с группировкой по одному полю и MAX по дате из этого поля?

  Ответить  
 
 автор: ShadowOfSun   (23.12.2009 в 21:58)   личное сообщение
 
 

как то так

SELECT *
FROM Общая
WHERE Общая.дата IN Max(Общая.дата);

  Ответить  
 
 автор: 3750905   (23.12.2009 в 22:51)   личное сообщение
 
 

1. ошибка: "невозможно использование статистической функции в предложении WHERE"
2. это не решает проблему, т.к. нет группировки по "товару"

  Ответить  
 
 автор: Гоблин   (23.12.2009 в 23:36)   личное сообщение
14 Кб.
 
 

В смысле так? Этот вопрос кажется уже решал.

  Ответить  
 
 автор: Denis V.   (23.12.2009 в 23:41)   личное сообщение
 
 

По-моему, я уже видел ответ на Ваш вопрос: http://hiprog.com/forum/read.php?id_forum=1&id_theme=6392&page=1, смотрите ответ от osmor в 21.12.2009 в 09:07.
Какие-то проблемы с объединением запросов? Используя конструктор запросов это можно сделать следующим образом:
- создаёте запрос с группировкой и выбором максимальной даты (уже умеете), сохраняете этот запрос и закрываете конструктор, чтобы не отвлекал;
- создаёте запрос в конструкторе, добавляете туда эту же таблицу и только что сохранённый запрос (я думаю, что Access сам создаст нужное объединение), выбираете все необходимые Вам поля.
И, как говорят французы: ву а ля!

  Ответить  
 
 автор: Гоблин   (23.12.2009 в 23:54)   личное сообщение
 
 

Да это получается объединенный запрос. То есть на каждую группу получается свой запрос. Потом объединять. Устать можно. А если группа добавится, что тогда? Тут проще надо.
Или я опять че-то не так понял.

  Ответить  
 
 автор: 3750905   (24.12.2009 в 00:02)   личное сообщение
 
 


(я думаю, что Access сам создаст нужное объединение)


к сожалению это не работает! Происходит дублирование полей в геометрической прогрессии.


я уже видел ответ на Ваш вопрос


В том ответе предлагалось получать ID последнего перемещения товара.

К сожалению это не работает, т.к.
- либо это третий столбец и результат с добавлением дополнительных строк повторяется,
- либо получая LAST (ID), я не корректно обрабатываю даты. (ввод данных задним числом - ID новое, а дата старая.)

  Ответить  
 
 автор: Гоблин   (24.12.2009 в 00:18)   личное сообщение
 
 

Видимо не прошло. Дело в том, что если группировать по всем полям, а каждое разное, то получится все равно несколько строк на каждую группу, так как значения полей разные. А что если делать следующее. Скажем по нажатию на кнопку выходит форма на групповой запрос - группа-товар и макс-дата, а у этой формы будет подчиненная - все остальные поля.

  Ответить  
 
 автор: 3750905   (24.12.2009 в 08:47)   личное сообщение
 
 

Это сделать можно, но цель - в одной таблице ВСЕ последние записи из группы по дате, остается не реализованной.

  Ответить  
 
 автор: 3750905   (24.12.2009 в 08:58)   личное сообщение
 
 

На другом форуме мне подсказали:

SELECT a.*
FROM Общая as a
inner join (SELECT товар, Max(дата) AS [Max-дата] FROM Общая GROUP BY товар) as m
on a.товар=m.товар and a.дата=m.[Max-дата]

  Ответить  
 
 автор: kot_k_k   (24.12.2009 в 09:24)   личное сообщение
 
 

мне каится изначально неправильно поставлено требование к запросу - от сбюда проблем.

1. ми хотели получить только товар и макс дату вне зависимости от клиентов и складов - нате - ваша 1-я реализация.

2. ви хотели получить товар и макс дату по каждому скаладу и для каждого клиента на этом складе - вот ваше расширенное:

SELECT товар, склад, клиент, Max(дата) AS [Max-дата]
FROM Общая
GROUP BY товар, склад, клиент;

3. если нужно конкретный склад / клиент ставим Where с нужными параметрами.

а то что получили, в конце дисскусии, звучит так:
"На какой склад и кем был завезен товар в последний раз, можно добавить - и в каком кол-ве".

новый гоооод настает!!!!

  Ответить  
 
 автор: osmor   (24.12.2009 в 11:05)   личное сообщение
11 Кб.
 
 

см. аттач
специально разделил на 2 запроса что бы было понятнее

  Ответить  
 
 автор: osmor   (24.12.2009 в 11:06)   личное сообщение
 
 

    
На другом форуме мне подсказали:

SELECT a.*
FROM Общая as a
inner join (SELECT товар, Max(дата) AS [Max-дата] FROM Общая GROUP BY товар) as m
on a.товар=m.товар and a.дата=m.[Max-дата] 


в случае если товар за один день перемещался более 1 раза, будет дублирование

  Ответить  
 
 автор: Denis V.   (24.12.2009 в 11:08)   личное сообщение
 
 

Ну, точно! Я забыл, что надо всё-таки указать условие объединения, для чего придётся переключиться в режим SQL, хотя нет, можно и в конструкторе добавить условие объединения. Хорошо, что на другом форуме подсказали ;-)
в случае если товар за один день перемещался более 1 раза, будет дублирование

В результирующем запросе можно просто добавить группировку.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList