powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скорость вычислений в запросе
12 сообщений из 12, страница 1 из 1
Скорость вычислений в запросе
    #32277119
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заранее прошу прощение за плохую читабельность
Есть запрос:
Код: 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.
SELECT Bill_arrival.[Реф №], Bill_arrival.Наименование, Bill_arrival.Дата1, Bill_arrival.Дата2, round(Bill_arrival.Эквивалент1,  2 ) AS [КА+ 1 ], round(Bill_arrival.Эквивалент2,  2 ) AS [КА- 1 ],  "" AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Bill_arrival
WHERE (((Bill_arrival.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Bill_charge.[Реф №], Bill_charge.Наименование, Bill_charge.Дата1, Bill_charge.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], round(Bill_charge.Эквивалент1,  2 ) AS [От А+ 1 ],round(Bill_charge.Эквивалент2,  2 ) AS [От А- 1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Bill_charge
WHERE (((Bill_charge.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Cash.[Реф №], Cash.Наименование, Cash.Дата, " " AS дата2, "  " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], round(Cash.Эквивалент1,  2 ) AS [K+ 1 ], round(Cash.Эквивалент2,  2 ) AS [K- 1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Cash
WHERE (((Cash.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Bank.[Реф №], Bank.Наименование, Bank.Дата1, Bank.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], round(Bank.Эквивалент1,  2 ) AS [Б+ 1 ], round(Bank.Эквивалент2,  2 ) AS [Б- 1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Bank
WHERE (((Bank.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Зад_потр.[Реф №], Зад_потр.Наименование, Зад_потр.Дата1, Зад_потр.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], round(Зад_потр.Эквивалент1,  2 ) AS [ 62 + 1 ], round(Зад_потр.Эквивалент2,  2 ) AS [ 62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Зад_потр
WHERE (((Зад_потр.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Зад_пост.[Реф №], Зад_пост.Наименование, Зад_пост.Дата1, Зад_пост.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], round(Зад_пост.Эквивалент1,  2 ) AS [ 61 + 1 ], round(Зад_пост.Эквивалент2,  2 ) AS [ 61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Зад_пост
WHERE (((Зад_пост.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT sklad.[Реф №], sklad.Наименование, sklad.Дата1, sklad.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], round(sklad.Эквивалент1,  2 ) AS [T+ 1 ], round(sklad.Эквивалент2,  2 ) AS [T- 1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM sklad
WHERE (((sklad.[Реф №])=[forms]![заказ]![ref]))
UNION ALL SELECT Realization.[Реф №], Realization.Наименование, Realization.Дата1, Realization.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], "" AS [T- 1 ], round(Realization.Эквивалент1,  2 ) AS [Рз+ 1 ], round(Realization.Эквивалент2,  2 ) AS [Рз- 1 ]
FROM Realization
WHERE (((Realization.[Реф №])=[forms]![заказ]![ref]));

Этот запрос работает с приемлемой скоростью
А вот другой запрос, основанный на этом, тормозит о-о-о-очень сильно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT  "Авансы будущих периодов"  As Наименование , Sum(IIf([ 62 +]= "",0 ,[ 62 +])) - Sum(IIf([ 62 -]=" ",0 ,[ 62 -])) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Задолженность клиента " As Наименование , Sum(IIf([КА+]="  ",0 ,[КА+])) - Sum(IIf([КА-]=" ",0 ,[КА-])) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Товар на складе " As Наименование , Sum(IIf([T+]="  ",0 ,[T+])) - Sum(IIf([T-]=" ",0 ,[T-])) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Плановые платежи " As Наименование , Sum(IIf([От А-]="  ",0 ,[От А-])) - Sum(IIf([От А+]=" ",0 ,[От А+])) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Себестоимость " As Наименование , (Sum(IIf([61 +]=" ",0 ,[ 61 +])) - Sum(IIf([ 61 -]=" ",0 ,[ 61 -]))) + (Sum(IIf([T+]=" ",0 ,[T+])) - Sum(IIf([T-]=" ",0 ,[T-]))) + (Sum(IIf([От А-]=" ",0 ,[От А-])) - Sum(IIf([От А+]=" ",0 ,[От А+]))) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Плановый доход " As Наименование , Sum(IIf([КА+]="  ",0 ,[КА+])) - Sum(IIf([От А-]=" ",0 ,[От А-])) AS [Сумма]
FROM проводки_1
UNION ALL SELECT "Реальный доход " As Наименование , Sum(IIf([Рз-]="  ",0 ,[Рз-])) - Sum(IIf([Рз+]="", 0 ,[Рз+])) AS [Сумма]
FROM проводки_1;

Возожно ли ускорить этот запрос?, т.е. я имею ввиду то, что можно ли получить такой же результат, но более оптимальным способом???
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277136
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть мысли
что вместо ииф-ов
было бы луче
юзать таблу-справочник
в которой
каждой проводке
сопоставлялся бы класс "авансы" ... "и т.д."

а потом ДЖОЙН справочника к данным
и счастье
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277149
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут подумал, что как ни крути, а быстрее будет работать напрямую с таблицей.
Код: plaintext
1.
2.
3.
4.
SELECT  "Авансы будущих периодов"  As Наименование , 
Sum(IIf(round(Зад_потр.Эквивалент1,  2 )= "",0 ,round(Зад_потр.Эквивалент1, 
 2 ))) - Sum(IIf(round(Зад_потр.Эквивалент2,  2 )="", 0 ,round(Зад_потр.Эквивалент2,  2 ))) AS [Сумма]
FROM Зад_потр
WHERE (((Зад_потр.[Реф №])=[forms]![заказ]![ref]))

Вопрос исчерпан
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277150
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боже мой, какой знакомый запрос
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277152
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем путать типы в 1-м (т.е. преобразовывать все в строку) и требовать неявного преобразования в цифирь во втором?

Почему не Null AS [КА+1],
или CDbl(0) AS AS [КА+1],
?
и тогда iif не нужен.
если для форматирования отчетов/форм - регулируйте пустышки в 0 форматом.
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277157
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha_1

больная тема

assa
ща обмозгую :)
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277181
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assa
Обмозговал :)
По-моему даже медленнее стало :)
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277185
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как сейчас помню, что на подобное восклицание с моей стороны,
Всеволод ответил примерно следующее:
"Не хочу чтоб вся таблица была в ноликах, хочу, чтоб поля были просто
пустыми"
собственно поэтому и был придуман изврат с iif isnull
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277189
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
SELECT  "Авансы будущих периодов"  AS Наименование, 
Sum(IIf(round([Зад_потр].[Эквивалент1], 2 )= "",0 ,round([Зад_потр].[Эквивалент1], 2 )))
-Sum(IIf(round([Зад_потр].[Эквивалент2], 2 )="", 0 ,round([Зад_потр].[Эквивалент2], 2 ))) AS Сумма
FROM Зад_потр
WHERE ((([Зад_потр].[Реф №])=[forms]![заказ]![ref]));

Хм... Если поле Эквивалент2 - пустое, то поле Сумма не вычисляется - это косяк :)
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277194
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha_1
Согласен Одно лечим другое колечим
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277210
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю я однако :)
Вот так работает:
Код: plaintext
1.
2.
3.
4.
SELECT  "Авансы будущих периодов"  AS Наименование, 
Sum(NZ(round([Зад_потр].[Эквивалент1], 2 ), 0 )) 
-Sum(NZ(round([Зад_потр].[Эквивалент2], 2 ), 0 )) AS Сумма
FROM Зад_потр
WHERE ((([Зад_потр].[Реф №])=[forms]![заказ]![ref]));
...
Рейтинг: 0 / 0
Скорость вычислений в запросе
    #32277220
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Медленнее с CDbl(0) или c Null?

____
ЗЫ (Help):
>>Используйте псевдонимы только в первом предложении SELECT, потому что в остальных они пропускаются
(это к слову)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скорость вычислений в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]