|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
Как в запросе с группировкой получить значение без использования групповых операций по одному из полей?04.01.2017, 18:50. Показов 9669. Ответов 42
Метки нет (Все метки)
Приветствую.
По причине большого количества строк в таблице excel решил перейти на access, для подготовки данных с последующей загрузкой результатов в excel. По сути одноразовая задача. Но казалось бы в простом запросе для меня возник нереальный затык, над которым я бьюсь несколько дней и пребываю в шоке от того, что не могу нагуглить ответ на этот вопрос. Есть исходная таблица. Столбцы: товар, вид операции (покупка или продажа), количество единиц в партии, магазин. В этой таблице разные магазины продают одни и те же товары (например книга, булка, телевизор), но по разным ценам и в разных количествах. Цель создать запрос, который находит минимальную цену продажи для каждого товара из исходной таблицы, указывает магазин, который продаёт по этой минимальной цене и количество товаров в партии. Казалось бы всё просто. Я создал запрос с группировкой по товару, вид операции "продажа", min по цене. Всё хорошо, я получаю результат. Для каждого товара найдена минимальная цена продажи. Но вот проблема, а как же теперь к найденной строке прицепить какой магазин и в каком количестве продаёт? При добавлении таких полей в запрос с группировкой, требуется указать групповую операцию, а мне нужно отобразить исходное значение магазина и количество в продаваемой партии для найденной цены. Ни одно из условий группировки не подходит для этой задачи, возможно кроме выражения, но поиски какое же выражение использовать для моей цели, так же не привели к успеху. Возможно эту задачу можно решить запросом без группировки? Буду благодарен любым подсказкам.
0
|
|
| 04.01.2017, 18:50 | |
|
Ответы с готовыми решениями:
42
Сложение данных из символьных полей в запросе с группировкой (аналог функции Sum() При попытке присвоить значение типа char одному из полей структуры, выводится некоректное значение Как получить символ клавиатуры без использования TextBox |
|
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|||||||||||||||||||||||||||||||||||||||||||||||
| 07.01.2017, 06:25 | |||||||||||||||||||||||||||||||||||||||||||||||
|
Несовпадения типов и станций привел подстановками из соответствующих таблиц. Запросы стали работать.
Считаем, что аналоги полей, таблиц прежнего и текущего проектов таковы как в приведенных табличках Таблицы
Поля
Если прав, то смотрите вложение. Форма та же, код поправлен. В таблице Temp изменены поля. Запрос на 2 миллионах сгенерированных записей длился 10 сек. Копируйте свои таблицы в эту БД. Таблицы, конечно должны называться как в присланной БД. Таблица Orders сейчас пустая. Иначе база будет весить 3 сотни мегабайт с 2 миллионами записей в Orders. Можно удалить все таблицы и скопировать заново из боевой БД. Перед большой таблицей желательно сжать базу.
1
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 07.01.2017, 08:04 [ТС] | |
|
texnik-san, да моя ошибка что я не описал соответствие таблиц и полей. Попробую коротко описать поля и задачу.
Основная таблица для запроса: Orders - объявления. Необходимые поля для запроса: buy имеет два варианта true - означает покупка, false - продажа; type - код товара; price - цена; stationID - код магазина; volume - продаваемое\покупаемое количество Запрос: для каждого type (товара) найти max price для buy=true (покупка) и min price для buy=false (продажа). На выходе для каждого товара type должна быть одна строка MinSell и одна MaxBuy. Задача решается простым запросом с группировкой по buy (true\false), type и price (min\max). Но проблема прицепить остальную необходимую информацию - это stationID (магазин) и volume (количество). Остальная информация желательна, но не обязательна и собирается из связанных таблиц: invTypes - список товаров. Поле invTypes.typeID (код товара) связано с полем Orders.type (код товара). Из этой таблицы берётся имя товара invTypes.typeName (имя товара) и invTypes.volume (объём этого товара) это значение НЕ то же самое что Orders.volume. таблица staStations - список магазинов. Поля: staStations.stationID связано с Orders.stationID. Отсюда берётся поле staStations.stationName (имя магазина) и staStations.regionID (код адреса магазина) таблица mapRegions - список адресов. mapRegions.regionID связано с staStations.regionID. Отсюда по коду адреса вытаскивается сам адрес mapRegions.regionName. По поводу Вашего варианта базы. Я изменил код товара в таблице Orders и код магазина в таблице staStations, так чтобы были найдены совпадения. В итоге Запрос ОбъявлениеСМинЦенойПродажи находит совпадения, но запрос МинПродажа выдаёт пустую таблицу. Во вложении эта база.
0
|
|
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 07.01.2017, 08:29 [ТС] | |
|
mobile, спасибо большое буду пробовать, пока писал ответ для texnik-san, Вы уже всё сопоставили.
Добавлено через 24 минуты mobile, проверил Ваш вариант. При вызове запроса через форму появляется ошибка "3021" Текущая запись отсутствует. Дебагер выделяет строку .MoveLast в Private Sub btnCalc_Click(). Если просто запустить запрос через MCena, выдаётся пустая таблица. При этом таблица Temp не пустая. P.S. вспомнил Вы спрашивали про дисковый кеш. У меня объём кеша 64 Мб.
0
|
|
|
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||
| 07.01.2017, 09:16 | ||
|
Возможно Вы экспериментируете на малой, не показательной выборке, примерно такой как в присланной ранее. Сделайте запрос на рабочем наборе.
1
|
||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 07.01.2017, 09:37 [ТС] | |
|
mobile, перенёс Ваши запросы в свою БД. Подключил библиотеку. Всё заработало. Но к сожалению с большим количеством записей запрос как и раньше выполняется очень долго
Как считаете в чём ещё может быть причина? Кеша 64 Мб достаточно?Добавлено через 14 минут Добавил данные именно в Ваш файл. В нём всё сработало быстро. Может быть наличие в моей БД дополнительных таблиц и связей как то влияет? Тогда почему только с определенного количества строк? Может быть правда проблема как то завязана с общим размером моей БД? Размер файла 612 Мб, а ограничение вроде бы до 2 Гб...
0
|
|
|
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|||
| 07.01.2017, 09:52 | |||
|
- Orders на buy, price, stationID, type, volume - staStations на stationID - invTypes на TypeID - mapRegions на regionID Добавлено через 4 минуты Попробуйте создать новую, чистую БД и импортом перенести в нее все-все из старой. Есть предположение, что БД несколько запорчена. Или пользуйтесь присланной мной, добавив туда отсутствующие таблицы.
1
|
|||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
||
| 07.01.2017, 10:04 [ТС] | ||
|
Добавлено через 8 минут Создал новый файл, скопипастил всё из старого файла в новый. Не помогло. Видимо какие то таблицы каким то образом влияют на выполнение запроса. Ума не приложу как это происходит. Оставлю только необходимые таблицы.
0
|
||
|
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|||||||
| 07.01.2017, 10:14 | |||||||
|
И насчет ошибки при отсутствии данных. Откройте форму Form1 в конструкторе. На экране должны быть Свойства формы. Если их нет, на ленте нажмите кнопку Свойства. Выделите кликом кнопку "Найти min/max товары". В свойствах выберите вкладку События и нажмите в строке "Нажатие кнопки" правую кнопочку с тремя точками. Попадете в редактор ВБА формы. Выделите мышкой всю процедуру, начиная со строки Private Sub btnCalc_Click() и заканчивая End Sub. Вместо нее вставьте текст:
Добавлено через 8 минут Создайте новую, чистую БД. На ленте выбрать "Внешние данные" и нажать кнопку Access. Откроется форма. В ней, по кнопке Обзор, укажите имя файла-источника (Ваша БД) и нажмите ОК. Откроется форма Импорт объектов. Выберите в ней все в каждой вкладке (кнопка Выделить все на каждой вкладке) и нажмите ОК. Все объекты перенесутся в новую БД. Если ошибки были, они исправятся. Вернее чаще всего исправляются. Но не всегда.
1
|
|||||||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
||
| 07.01.2017, 10:37 [ТС] | ||
|
mobile, поменял код, выполнил, всё работает. Обнаружил ещё такой момент если по товару есть совпадение по цене и количеству он выдаёт все эти варианты. Можно ли как то в коде добавить чтобы при совпадении выдавался просто первый попавшийся вариант, а не все?
Добавлено через 4 минуты Добавлено через 5 минут Обнаружилась ещё одна интересная деталь, даже если просто пересохранить Ваш файл с помощью сохранить как, в новом файле выполнение запроса становится медленным (у меня Access 2016)
0
|
||
|
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||
| 07.01.2017, 10:45 | ||
|
Попробуйте вместо "сохранить как" использовать "Сохранить и опубликовать". Причем не в MDB, а в ACCDB. Совершенно не исключаю, что разработчики наплевали на "старый" формат и где-то там наделали новых ошибок. Исправляя старые. Насчет копий. Надо знать будет ли поле buy логическим впредь или оставите текстовым. Логическим быстрее работает.
1
|
||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|||
| 07.01.2017, 11:06 [ТС] | |||
|
Добавлено через 5 минут
0
|
|||
|
шапоклякистка 8-го дня
|
||
| 07.01.2017, 12:36 | ||
|
Немного переделала свои запросы, чтобы еще выиграть в скорости: все же соханяю результаты вложенного запроса во временную таблицу, создаю в этой таблице индексы и только после этого делаю итоговую выборку. Можно запускать запросы руками в поядке нумерации (из запросов 0А и 0В выбрать только один нужный), или запустить один из двух макросов (если уж вы так сильно боитесь форм). Самое смешное, что я совешенно не уверена, что мой метод имеет хоть какие-то пеимущества перед методом mobile. Вы, конечно, пробуйте и тестируйте - поскольку мы все не понимаем причину тормозов в вашей базе, то и прогнозовать, будет ли мой метод бытрее или медленнее я не могу. Но вообще я сама бы ставила на метод mobile.
1
|
||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 07.01.2017, 14:03 [ТС] | |
|
texnik-san, спасибо, буду пробовать. Сейчас обнаружил что даже после сжатия базы, запрос от mobile начинает работать долго. Уже подумываю, а не установить ли мне access 2010.
Добавлено через 1 час 21 минуту Access 2010 не помог, может быть причина в том что у меня версия офиса х64?
1
|
|
|
Модератор
|
|||||||||||
| 07.01.2017, 14:08 | |||||||||||
|
если без рабочих таблиц
запрос z00
запрос z01 --можно регулировать потребное условие
1
|
|||||||||||
|
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||
| 07.01.2017, 14:27 | ||
|
1
|
||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 07.01.2017, 15:02 [ТС] | |
|
texnik-san, после импорта большого количества строк запрос МаксПокупка долго выполняется, результат не дождался, а МинПродажа выполняется быстро, но он выдаёт не правильные цены.
Добавлено через 11 минут Провести чистый эксперимент с файлом texnik-san не могу, так как копирование большого количества строк в таблицу Orders, почему то длится очень долго и зависает. А при импорте из текстового файла возможна та же проблема, что и с файлом mobile. Добавлено через 9 минут shanemac51, спасибо за участие! Я создал два Ваших запроса. z00 в полу minprice нули. В max price вроде всё правильно. Запрос z01 выдаёт то что надо, но в поле minprice также нули (так как в первом запросе нули). Где то ошибка.
0
|
|
|
Модератор
|
|||||||||||||||||
| 07.01.2017, 15:14 | |||||||||||||||||
|
в зависимости от buy надо или одно или другое регулируется в строке отбора сейчас там
1
|
|||||||||||||||||
|
26828 / 14509 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
| 07.01.2017, 15:39 | |
|
Allexxandr, сделал еще вариант. Появилась таблица OrdersTemp, куда при выборе типа (True, False) копируются данные только этого типа. И далее работа с этой таблицей, что позволит уменьшить объем. Может быть решит проблему большой таблицы.
Также исправлено ситуация с дублями, теперь без копий. Еще изменен тип поля StationID в таблицах Orders, OrdersTemp и staStations. Вместо текстового числовое, целое. Это быстрее. Максимальное значение в 32-разрядном аксе больше 2 миллиардов, а в 64 вообще невообразимое число. Таблица Orders сейчас пустая. Вместо нее надо взять Вашу.
1
|
|
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|||||||||||
| 08.01.2017, 05:16 [ТС] | |||||||||||
|
shanemac51, разобрался. Запрос z01 разделил на два, один для продажи, второй для покупки. Только вот так и не понял почему в z00 всё таки не выдавало минимальную цену в столбце (только одни нули). Поэтому поменял z00 на такой запрос:
Добавлено через 2 минуты mobile, спасибо! Буду пробовать. Но думаю, что вариант от shanemac51 меня устроит. StationID я специально задал как текст, так как там есть например такие коды 1022365155834, а это выходит за пределы ограничения длинного целого. Добавлено через 12 часов 58 минут shanemac51, ошибся и вставил Ваш же запрос вместо своего. z00 поменял на такой:
0
|
|||||||||||
|
шапоклякистка 8-го дня
|
||
| 08.01.2017, 10:17 | ||
|
0
|
||
| 08.01.2017, 10:17 | |
|
Вывести большее из двух чисел без использования операций сравнения Как получить приблизительное местоположение пользователя без использования сервисов Google? Как получить значение поля в запросе по ключу Как получить данные из базы данных БЕЗ использования php только JS(ajax) Определить суму цифр заданного числа без использования операций целочисленного деления Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|