|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
Как в запросе с группировкой получить значение без использования групповых операций по одному из полей?04.01.2017, 18:50. Показов 8958. Ответов 42
Метки нет (Все метки)
Приветствую.
По причине большого количества строк в таблице excel решил перейти на access, для подготовки данных с последующей загрузкой результатов в excel. По сути одноразовая задача. Но казалось бы в простом запросе для меня возник нереальный затык, над которым я бьюсь несколько дней и пребываю в шоке от того, что не могу нагуглить ответ на этот вопрос. Есть исходная таблица. Столбцы: товар, вид операции (покупка или продажа), количество единиц в партии, магазин. В этой таблице разные магазины продают одни и те же товары (например книга, булка, телевизор), но по разным ценам и в разных количествах. Цель создать запрос, который находит минимальную цену продажи для каждого товара из исходной таблицы, указывает магазин, который продаёт по этой минимальной цене и количество товаров в партии. Казалось бы всё просто. Я создал запрос с группировкой по товару, вид операции "продажа", min по цене. Всё хорошо, я получаю результат. Для каждого товара найдена минимальная цена продажи. Но вот проблема, а как же теперь к найденной строке прицепить какой магазин и в каком количестве продаёт? При добавлении таких полей в запрос с группировкой, требуется указать групповую операцию, а мне нужно отобразить исходное значение магазина и количество в продаваемой партии для найденной цены. Ни одно из условий группировки не подходит для этой задачи, возможно кроме выражения, но поиски какое же выражение использовать для моей цели, так же не привели к успеху. Возможно эту задачу можно решить запросом без группировки? Буду благодарен любым подсказкам.
0
|
|
| 04.01.2017, 18:50 | |
|
Ответы с готовыми решениями:
42
Сложение данных из символьных полей в запросе с группировкой (аналог функции Sum() При попытке присвоить значение типа char одному из полей структуры, выводится некоректное значение Как получить символ клавиатуры без использования TextBox |
|
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||||||
| 04.01.2017, 19:33 | ||||||
|
Примерный запрос в SQL. Без выложенной Вашей БД может быть только структурно
1
|
||||||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 05.01.2017, 02:15 [ТС] | |
|
mobile, спасибо за ответ. Я так понимаю это запрос с под запросами? Попробовал этот код, результат формировался очень долго и итогов я так и не дождался. Видимо я что-то упустил в формулировании задачи. Попробую составить упрощённый файл mdb.
0
|
|
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 05.01.2017, 03:35 [ТС] | |
|
Во вложении пример БД с запросами. Указано два примера запросов: на минимальную продажу и на максимальную покупку, оба запроса имеют дополнительные поля собранные из разных таблиц. Но проблема в том, что происходит группировка по всем прочим параметрам, а мне нужно чтобы группировка была как в третьем примере запроса (только по товару), но в таком запросе нет информации по магазинам, количеству товаров и т.д. которые соответствуют найденной максимальной цене покупки.
0
|
|
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
||||||
| 05.01.2017, 04:09 [ТС] | ||||||
|
Забыл добавить код предложенного Вами запроса. Напишу его в этом сообщении. В упрощённой базе он выдал результат, но опять же в выборке присутствуют несколько магазинов, а не один с минимальной ценой продажи.
0
|
||||||
|
369 / 88 / 8
Регистрация: 14.08.2012
Сообщений: 248
|
||
| 05.01.2017, 06:30 | ||
|
0
|
||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
||
| 05.01.2017, 06:50 [ТС] | ||
|
А в целом принцип отбора, если для минимальной продажи: выбрать все варианты с продажей, сгруппировать таблицу по товарам и взять минимальную цену для этого товара. Это легко реализуется групповым запросом (пример есть в файле), проблема в том как подцепить магазин и количество товара из найденной строки с ценой.
0
|
||
|
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
| 05.01.2017, 13:43 | |
Сообщение было отмечено texnik-san как решение
Решение
Allexxandr, смотрите вложение. На форме Form1 выбираете тип объявления (продажа/покупка), показатель (макс/мин) и нажимаете большую кнопку. Для почти 65 тысяч записей время работы меньше секунды.
Что сделано: 1. В т.Объявления заданы индексы на поля кода товара, цены и количества 2. Создана вспомогательная таблица Temp куда грузятся макс или мин цены и количество для заданного типа объявления и кода товара. Там тоже созданы индексы. Без индексов будет работать в 100 раз медленнее. Для удобства, а также заполнения таблицы Temp, создана форма Form1. На ней, помимо полей со списком и кнопки, также 2 поля где показывается количество записей в исходной таблице и время работы до вывода данных. Также создана форма MCena для вывода данных. Можно было бы конечно использовать запрос, но в нем труднее менять надписи и тогда сложнее ориентироваться. Форма MCena выходит автоматом после нажатия кнопки. Таблицы Объявления, Магазины и товары сейчас забиты мусором. Я программно вставлял туда данные для проверки скорости. Да, имейте в виду, что в Вашей БД не была присоединена библиотека DAO. Я вставил ее в референсах. Без этой библиотеки работать не будет
1
|
|
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
||
| 05.01.2017, 19:18 [ТС] | ||
|
Добавлено через 3 часа 21 минуту mobile, огромное спасибо за титанический труд! В файле немного разобрался. В основной базе пока не тестировал, нужно ещё перенести данные в неё с изменением имён полей на исходные. Правда такой расширенный функционал с формами и макросом VBA совместно с запросом SQL усложняет понимание и дальнейшее редактирование. Для моих целей вместо одного изменяемого запроса, было бы достаточно два постоянных запроса: -- минимальная продажа (MinSell) и --максимальная покупка (MaxBuy). Результаты этих запросов будут связаны c листами в excel, в которых будет происходить дальнейшая обработка информации. Как я понимаю для реализации такого варианта мне нужно по аналогии создать две временных таблицы (temp) и под каждую переделать макрос, который будет запускаться при выполнении запроса? Или есть способ проще? Добавлено через 1 час 28 минут В основной базе запустить запрос не получилось так как нет библиотеки DAO. Я перенёс листы с данными в Ваш файл. В среднем в файле более миллиона строк (1 051 000). Проверял скорости обработки с разным количеством строк. --142 тысячи за 3 секунды, --525 тысяч за 20 секунд, --746 тысяч за 32 секунды, --а вот требуемое количество более миллиона обрабатывается очень долго, за 10 минут полоска выполнения запроса заполняется до 5%, далее у меня не хватает терпения ждать, но по расчётам получается 200 минут, что очень долго. Подскажите, пожалуйста, в чём может быть причина? Почему до 750 тысяч строк запрос выполняется быстро, а более миллиона строк очень долго?
0
|
||
|
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
| 05.01.2017, 19:31 | |
|
Причин может быть много:
- мало оперативной памяти - во время работы программы открыто много других приложений, съедающих память - не хватает места на диске - мал дисковый кэш - злобный антивирус - размер БД вместе с вспомогательными таблицами приближается к 2 ГБ - перед выполнением большой таблицы выполнялись многократные удаления большого количества данных и накопился мусор. Сжатие БД перед запуском большой таблицы поможет в этом случае.
2
|
|
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
||
| 06.01.2017, 06:06 [ТС] | ||
|
Оперативки 8 ГБ. В момент выполнения ничего особенного поедающего память не запущено. Свободного места на диске 300Гб, размер файла 180 Мб, антивирус отключал. Эффекта не было. В момент выполнения запроса занято всего 25% ресурсов процессора и всего 55Мб оперативной памяти. Может быть эта проблема как-то связана с подключаемой библиотекой? Не может ли быть в ней ограничения на количество обрабатываемых строк? Например как в последней версии excel 2016 не более 1 048 000 строк?
0
|
||
|
шапоклякистка 8-го дня
|
||||||||
| 06.01.2017, 08:19 | ||||||||
|
Добавлено через 10 минут
1
|
||||||||
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
||
| 06.01.2017, 09:30 [ТС] | ||
|
texnik-san, спасибо за участие в обсуждении. Как я уже понял, реализовать задачу одним запросом не возможно. Мне нужны два запроса без использования формы ввода, так как к книге excel для определенного листа будет импорт данных из своего запроса access. Первый запрос нужен типа таблицы temp (не обязательно ведь его создавать в виде таблицы?), а второй и третий будут в свою очередь оперировать с этим запросом temp, и опираясь на файл, который сделал mobile, попробую создать запросы, чтобы "подтягивать" к строкам в temp, соответствующие поля из связанных таблиц.
0
|
||
|
шапоклякистка 8-го дня
|
|||||
| 06.01.2017, 10:13 | |||||
|
Сохранение резальтатов вложенного запроса во временной таблице - это способ ускорить работу основного запроса. Добавлено через 4 минуты Добавлено через 5 минут Тормоза при миллионе записей возникают потому, что аксес в принципе и не расчитан на работу с такими объемами. Это облегченная СУБД и ее потолок - пара сотен тысяч записей. Больше она теоретичеки может, а практически - вы сами видите. Добавлено через 31 минуту Вообще, что я порекомендовала бы для ускорения в вашем случае: 1. Разделить таблицу объявлений на две - в одной только объявления "покупают", в другой - только "продают". Все равно вы ищете всегда только в одном из подмножества. Если же это не подходит - то хотя бы исправьте тип поля на числовой или логический (например, -1 продают, 0 покупают) и как самый минимум - индекируйте это поле!!! У вас по нему выполняется отбор, а поле тектовое и индекса нет.
1
|
|||||
|
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
| 06.01.2017, 10:33 | |
|
Allexxandr, попробовал сгенерировать 2 миллиона записей, точнее 1 975 700, со случайными ценами и количеством, а также сгенерированной тысяче магазинов. Время исполнения 6 секунд. Так что причина не в количестве записей. Поскольку ресурсы Вашего компа значительны и не препятствуют работе (хотя о дисковом кэше Вы не упомянули и также не сказали о сжатии БД), то предположительно причина медленной работы в структуре и характере самих данных, полученных из Excel.
Выложите на форум фрагмент боевой БД с парой тысяч записей из того набора, который медленный. Заодно можно будет поправить код для новых названий таблиц
1
|
|
|
шапоклякистка 8-го дня
|
|
| 06.01.2017, 10:34 | |
|
2. В таблице объявлений создала бы ключевое поле. Например, счетчик. Чтобы строки таблицы можно было однозначно определить по этому ключу.
3. И вот только при выполнении пп.1 и 2 станет возможным более оптимальное решение (см. файл). Таблицу на две я делить пока не стала, создала логическое поле "продают" (чтобы не путать со старым текстовым полем "покупают") - в нем значение "истина" (оно же -1) соответствует продаже, а "ложь" (оно же 0) - покупке.
1
|
|
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 06.01.2017, 10:53 [ТС] | |
|
mobile, texnik-san, спасибо, буду разбираться дальше. Видимо проблема возникла у меня из -за переноса в основную базу, а там и поля и таблицы иначе называются, может быть я где то, что-то не так переименовал.
Это я в базе для примера и листы и поля назвал по русски, чтобы было нагляднее. Как говорится: хотел как лучше, а получилось как всегда
0
|
|
|
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 32
|
|
| 06.01.2017, 13:29 [ТС] | |
|
texnik-san, перенёс запросы в свою базу, переименовал, при вызове зависает, при отмене сообщает что "данный подчинённый запрос должен возвращать не более одной записи", видимо не осилю я правильное переименование...
Во вложении база с оригинальными именами таблиц и полей. Там же примеры запросов на максимальную покупку (MaxBuyGroup). Задача "подцепить" к этому запросу поля из связанной таблицы (пример MaxBuyNeed). для того чтобы соблюсти размеры пришлось удалить основную часть информации по товару, из-за этого запрос MaxBuyNeed ничего не выдаёт, так как не находит соответствий.
0
|
|
|
шапоклякистка 8-го дня
|
|
| 06.01.2017, 16:29 | |
|
Allexxandr,
Ваши запросы вам УЖЕ рассказали, как привязать. Этого я не улучшу. МОИ запросы - ну, я попробовала угадать, какому полю в предыдущей базе соответствует что из выложенной вами сейчас, но не все поддается логике. Скажем, я думала, что --таблица invTypes содержит список товаров, --а поле type таблицы Orders содержит эти коды этих товаров (так было вполне логично подумать, глядя на вашу схему данных) совпадений по кодам в этих таблицах нету ни одного. Если бы совпадения были - запрос бы работал.
1
|
|
|
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|||||||
| 07.01.2017, 02:25 | |||||||
1
|
|||||||
| 07.01.2017, 02:25 | |
|
Помогаю со студенческими работами здесь
20
Вывести большее из двух чисел без использования операций сравнения Как получить приблизительное местоположение пользователя без использования сервисов Google? Как получить значение поля в запросе по ключу Как получить данные из базы данных БЕЗ использования php только JS(ajax) Определить суму цифр заданного числа без использования операций целочисленного деления Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|