|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
\\\\guest_rusimport, очень спорное решение. Гораздо проще получить строку через ADO (GetString), ИМХО. не понял , а спорить то тут о чем ? :) есть такой вариант , и он работает :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 12:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
guest_rusimport...не понял , а спорить то тут о чем ? ...Это не спор, это (см. название топика) анализ чужих решений... ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 12:49 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
\\\\, ну, тогда уж надо было указать достоинства , недостатки, сравнить с другими вариантами :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 16:17 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Для решения одной специфической задачи мне пришлось группировать записи и умножить значения, а не просуммировать. Дело в том, что существует агрегатная функция суммирования (SUM), а вот умножения (Multiply) – нет. Как быть? Есть несколько способов решения данной задачи. Вариант №1. Нужно в VBA функции динамически создать SQL текст запроса (перебирая циклом) и перед запуском самого запроса подменить текст. Что-то вроде этого: Код: sql 1. 2. 3. 4.
Данный метод хорош, когда речь идёт о сравнительно небольшом количестве записей. Если же речь идёт о сотни тысяч, а то и более записей, то этот метод не годится. Во-первых, слишком долго будет программа обрабатывать циклом записи и во-вторых, SQL текст запроса не бесконечный, миллион символов не переварит. Вариант №2. Создаём VBA функцию, которая циклом перебирает значения по указанному ID и умножает значения. А в тексте запроса просто указываем название VBA функции. Метод хорош, но для большого количества записей будет требовать много времени на обработку. Вариант №3. Создаём VBA функцию, которая также циклом перебирает значения по указанному ID и превратив числовое значение в текстовое будет сцеплять их. Что-то вроде «2*115*17» для каждого ID. А в тексте запроса указываем название VBA функции, при этом обернув полученное значение дополнительной функцией EVAL. Этот метод хуже, чем вариант №2. Кроме того, из-за режима «печосницы» (SandboxMode) функция EVAL может и не работать у всех. Вариант №4. На просторах интернета я встретил самую необычную и изящную идею. Тот, кто додумался до этого, просто гений! Я бы сам никогда не додумался. Метод настолько очаровал меня, что я решил поделиться им. Оказывается агрегатной функции SUM вполне достаточно! Но вот только придётся изощряться. Дело в том, что сумма логарифмов с одинаковым основанием равняется как раз таки логарифму точно с таким основанием, но с умножением значений. Т.е.: LN(A1) + LN(A2) + … + LN(An) = LN(A1*A2*…*An) Чтобы избавиться от логарифма полученное таким образом значение потом нужно будет воздвигать в степень e. Правда тут есть нюансы: все умножаемые числа должны быть больше 0, а для этого придётся брать только абсолютное значение и параллельно ввести учёт знаков. Ну и в случае нулевого значения добавить «костыль». И так. Чтобы было более понятно о чём речь создаём таблицу в VBA и добавляем тестовые значения. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Вот теперь и запускаем вот такой запрос: Код: sql 1. 2. 3. 4.
Выражение « (-1)^(SUM(IIf(Val<0,1,0))) » необходимо чтобы следить за знаком (в случае если окажется отрицательное число). Выражение « MIN(IIf(Val=0, 0, 1)) » необходимо для выяснения нет ли 0 среди умножаемых значений. Как то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2020, 10:11 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если Вы точно знаете, что среди значений нет нуля и все числа всегда положительные, то и текст запроса будет проще. Код: sql 1. 2. 3. 4.
P.S. Конечно же нужно учесть при этом, что если умножаемых чисел слишком много или же сами числа достаточно огромные, то может возникнуть ошибка переполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2020, 10:19 |
|
|
start [/forum/topic.php?fid=45&gotonew=1&tid=1610226]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
11ms |
get first new msg: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 346ms |
total: | 581ms |
0 / 0 |