|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
Задаю вопрос сюда, хотя надо для VBA. Таблица price.dbf с несколькими столбцами (полями), в них числовые данные, например: Код: plaintext 1. 2. 3. 4. 5. 6.
least 1 2 1 1 3 0 Если бы было только 2 поля, то всё получается. Что-то примерно такое (код для VBA): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Но конструкция из iif для четырёх полей уже не воспринимается: вылетает ошибка "SQL expression is too complex" Есть ли функция типа НАИМЕНЬШИЙ(список данных) в Excel, но для SQL-запроса? Вроде как есть что-то типа LEAST(dat1, ...), но для ORACLE и в sql-запросе не работает. Ещё плохой нюанс: структура таблицы такая, что работает только {Microsoft Visual FoxPro Driver}, а в нём на VBA не работают ни UNION, ни вложеные SELECT. Только JOIN. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2012, 22:08 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
А что, Provider=vfpoledb;Data Source=DirPath не помогает разве? В нем же и UNION ALL, и подзапросы в FROM есть... Попробуйте... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2012, 05:21 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
AndreTM, 1. На одном компьютере на строке Код: vbnet 1.
появляется ошибка Run-time error '3706' Не удаётся найти указанного поставщика. Вероятно, он установлен неправильно Хотя в References стоят галки на Microsoft ActiveX Data Objects 2.8 Library и Microsoft ActiveX Data Objects Recordset 2.8 Library Что-то надо ещё подключать? 2. На другом компе ошибки '3706' не появляется (и, кстати, в References галки именно только там же, что и на первом компьютере), но появляется ошибка "Syntax error". Что-то не так в строке запроса. Если строку запроса переделать на простую, то всё работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2012, 09:09 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
А там референсы и не нужны: вообще-то, в коде - позднее связывание... Для начала - убрать надо все неопределившиеся связи с библиотеками; затем - что там с синтаксисом? - я ведь тестировал "на ходу", но только на 32-bit системах... вполне вероятно, что под W2k8 x64 код может повести себя непредсказуемо - именно из-за провайдера , которого там изначально немА... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2012, 09:26 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
Да уж... :-) Позднее связывание, неопределившиеся связи с библиотеками... Я, наверное, зря полез в это: я совсем в этом не понимаю. Использую sql-запросы только в макросах Excel. По ходу дела пришлось овладеть минимальным уровнем языка запросов, а вот в "провайдерах" и прочем не разбираюсь: просто на этом форуме дали мне некую рабочую схему, её и использую, немного изменяя только строку запроса. Наверное, придётся через sql-запрос брать все 4 поля с ценами и создать отдельную процедуру уже в VBA для обработки полученного массива на предмет поиска наименьших цен по каждой строке. AndreTM, большое спасибо за желание помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2012, 13:47 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
tolikt, Проверено в Visual FoxPro 9.0 SP1 - работает SELECT c3.min_price FROM (SELECT c1.rn,NVL(c2.mnpr,0) as min_price FROM (SELECT p1.rn,MIN(p1.pr) as mnpr FROM (SELECT price_1 as pr,RECNO() as rn FROM price UNION ALL SELECT price_2 as pr,RECNO() as rn FROM price UNION ALL SELECT price_3 as pr,RECNO() as rn FROM price UNION ALL SELECT price_4 as pr,RECNO() as rn FROM price ORDER BY rn) p1 GROUP BY p1.rn) c1 LEFT JOIN (SELECT p1.rn,MIN(p1.pr) as mnpr FROM (SELECT price_1 as pr,RECNO() as rn FROM price UNION ALL SELECT price_2 as pr,RECNO() as rn FROM price UNION ALL SELECT price_3 as pr,RECNO() as rn FROM price UNION ALL SELECT price_4 as pr,RECNO() as rn FROM price ORDER BY rn) p1 WHERE p1.pr#0 GROUP BY p1.rn) c2 ON c2.rn=c1.rn) c3 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2012, 16:21 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
toliktЕсть ли функция типа НАИМЕНЬШИЙ(список данных) в Excel, но для SQL-запроса? Насколько я знаю, такого нет. Точнее, есть, но не совсем то, что Вам нужно. Ведь Вам и функция НАИМЕНЬШИЙ() не очень-то подойдет. Вы будете вынуждены вызывать ее дважды. Сначала для первого наименьшего, и если он 0, то искать второе наименьшее. В общем случае, запрос, вероятно, сконструировать можно. Только очень уж он громоздкий получится. Для примера попробуйте "расшифровать" то, что привел novichok_86 . Ну, один раз Вы в этой "каше" разберетесь, а когда через месяц придется что-то подправить сможете вспомнить "кто на ком стоял" Думаю, значительно более простым решением будет написать макрос в Excel. Т.е. из таблицы DBF делается выборка "как есть", а уже в макросе Excel выполняется поиск минимального не нулевого значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2012, 19:17 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
Увы, строка от novichok_86 тоже не работает... А Visual FoxPro 9.0 SP1 только для этого устанавливать, думаю, не очень целесообразно.... До совсем непонятного RECNO() так и не дошёл... Но выяснил, что ошибка syntax error происходит из-за того, что не работают вложенные SELECT. Даже простенькая строка запроса SELECT pr1 FROM (SELECT price1 AS pr1 FROM price). Зато выяснил, что работает UNION. Уже хорошо: использую где-нибудь в другой задаче. В общем, как я и предполагал и как посоветовал ВладимирМ, лучше всего наименьшую цену вычислять средствами VBA в уже полученном sql-запросом массиве. Тем более, что алгоритм очевидный. Спасибо всем. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2012, 20:48 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
Если считаете, что UNION может вам пригодиться в другой задаче, тогда и RECNO() тоже может когда-нибудь пригодиться - эта штуковина просто выдаёт номер записи, а в запросе от novichok_86 применяется для сортировки в ORDER BY ... Успехов! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2012, 09:28 |
|
Запросом получить список наименьших значений из некольких полей
|
|||
---|---|---|---|
#18+
Сам FoxPro устанавливать не надо. Просто есть два драйвера для работы с таблицами FoxPro. Один - это драйвер ODBC. Именно его Вы и использовали. Но этот драйвер последний раз обновлялся для версии VFP6. Поэтому и не поддерживает вложенные запросы. Они на тот момент не поддерживались в FoxPro. Другой - это драйвер OLE DB (ADO). Он был разработан для версии VFP9. Поддерживает вложенные запросы. Только при его использовании для создания соединения будет работать запрос novichok_86 (хотя сам запрос избыточный). Оба драйвера можно бесплатно скачать с сайта MicroSoft. Просто для Вашей задачи - это слишком сложное (избыточное) решение. В данном случае значительно проще сделать обработку уже полученной выборки на стороне Excel через макросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2012, 14:32 |
|
|
start [/forum/topic.php?fid=41&msg=37790419&tid=1583672]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 153ms |
0 / 0 |