|
|
|
Быстрый поиск по диапазону и подсчет значений
|
|||
|---|---|---|---|
|
#18+
Помогите разобраться со следующим: Есть книга Excel с двумя листами 1 - для отчета, другой - это прямоугольная таблица (вроде БД). имена столбцов - это имена переменных, для которых по некоему критерию надо подсчитать количество значений в соответсвующем столбце. однако критерий может быть множественный и обычно это выглядит как перечисление значений через запятую. К примеру, есть переменная "arrival_day", и я хочу для соотв. столбца подсчитать количество значений по условию "7,9,10,12" (условие может быть произвольным и не только числовым). Т.е. если листе с данными я должен подсчитать кол-во строк в столбце "arrival_day" если значение переменной равно одному из значений в условии. Переведя на SQL это было бы так, к примеру Код: plaintext Я написал UDF которая так и поступает, однако использование Excel в качестве БД и выполнение запросов к нему чревато неадекватным поведением (зависанием процесса в памяти, невозможностью сохранить файл и т.п.), поэтому SQL хотелось бы избежать. Как вариант - перебор всех строк столбца на вхождение в условие работает нормально, но долго, в случае если отчет содержит много строк с условиями, а таблица с БД - соотв. много данных. Т.е. хотелось бы что нибудь без переборов, SQL и фильтров, чтобы работало быстро.... Код за меня писать не прошу, проблем с этим нет, а прошу подсказать алгоритм (а может Excel уже содержит формулы которые могут помочь, т.к. те что есть ищут по единичным условиям, типа больше меньше равно чему то одному). Пример прилагаю. Ф-я принимает в качестве вход. параметров: имя переменной, диапазон с условиями, доп. условие (тут проще, т.к. доп. всегда одно), и лог. параметр который показывает или мы считаем вхождения по условию или исключения. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 15:08 |
|
||
|
Быстрый поиск по диапазону и подсчет значений
|
|||
|---|---|---|---|
|
#18+
Диклевич Александр, если нужна UDF, то лучше сделайте формулу массива, вот так похоже будет очень быстро Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 16:30 |
|
||
|
Быстрый поиск по диапазону и подсчет значений
|
|||
|---|---|---|---|
|
#18+
Диклевич Александр, авторЯ написал UDF которая так и поступает, однако использование Excel в качестве БД и выполнение запросов к нему чревато неадекватным поведением (зависанием процесса в памяти, невозможностью сохранить файл и т.п.), поэтому SQL хотелось бы избежать. как то Вы небрежно, с SQL обошлись. Не заслуживает он этого, все зависит от рук программиста...... ps...... а форум Вы почему то SQL.RU открыли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 16:57 |
|
||
|
Быстрый поиск по диапазону и подсчет значений
|
|||
|---|---|---|---|
|
#18+
Диклевич Александр, Вообще, неплохо бы определиться. Вам нужен именно динамический расчет? То есть обязательно на ходу и формулами... и при этом вы используете монстроидальные UDF. И при этом отказываетесь от Select-SQL. И при этом оперируете некими "именами полей (столбцов БД)", которые при таком подходе вообще не требуются. Или ваше "неприятие" SQL произрастает из того, что вы пытались сообразить "летучую" UDF с запросом? ИМХО (как и R Dmitry), нормально реализовать вашу задачу можно именно (и только) с помощью запросов (ну и некоторого необходимого количества формул листа). Вы бы "поплотнее" сформулировали задачу. Например, количество полей в DATA будет бОльшим, чем сейчас? Выборки будут осуществляться по бОльшему количеству условий (навскидку - а где год)? Таблица DATA должна быть именно такого формата? И т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 17:38 |
|
||
|
Быстрый поиск по диапазону и подсчет значений
|
|||
|---|---|---|---|
|
#18+
AndreTM, почему же только запрос? Например такой вариант - по скорости чуть выигрывает у варианта R Dmitry ( 0,4375 vs 0,78125), и отбор по датам есть и легко нарастить. Я пошёл другим путём - сперва собрал данные в словарь, потом из словаря тянул количество повторов. Можно (как обычно) количество повторов в параллельный массив складывать - есть свои плюсы, можно больше разных данных собирать. Код: plaintext 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 22:08 |
|
||
|
|

start [/forum/topic.php?fid=61&gotonew=1&tid=2176439]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
10ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 463ms |

| 0 / 0 |
