Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Возможна ли оптимизация запроса ? / 7 сообщений из 7, страница 1 из 1
26.10.2015, 20:52
    #39087390
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли оптимизация запроса ?
Вот весь запрос, он работает как надо, но есть предположение, что его выполнение можно оптимизировать...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT a.prodID, a.prodName, c.Quantity, 
                                    (select sum(f.Quantity) from operations f where f.operName='realiz' and f.operDate<#7/23/15# and f.prodID=a.prodID) AS bRealiz,
                                    (select sum(f.Quantity) from operations f where f.operName='prihod' and f.operDate<#7/23/15# and f.prodID=a.prodID) AS bPrihod,
                                    (select sum(f.Quantity) from operations f where f.operName='spisanie' and f.operDate<#7/23/15# and f.prodID=a.prodID) AS bSpisanie,
                                    (select sum(f.Quantity) from operations f where f.operName='vozvrat' and f.operDate<#7/23/15# and f.prodID=a.prodID) AS bVozvrat,
                                    SUM (IIF(b.operName='realiz', b.Quantity, 0)) AS Realiz,
                                    SUM (IIF(b.operName='prihod', b.Quantity, 0)) AS Prihod,
                                    SUM (IIF(b.operName='spisanie',  b.Quantity, 0)) AS Spisanie,
                                    SUM (IIF(b.operName='vozvrat', b.Quantity, 0)) AS Vozvrat
FROM   (((products a)
LEFT JOIN  (SELECT * FROM operations WHERE operations.operDate between #7/23/15# and #7/30/15#) As b ON a.prodID = b.prodID)
LEFT JOIN  (SELECT * FROM remains WHERE remains.periodID=1) As c ON a.prodID=c.prodID)
GROUP BY a.prodName,a.prodID,c.Quantity


Объясню смысл происходящего, данный запрос из таблицы remains запрашивает остатки товаров на нужный период (начало месяца), затем серией подзапросов к таблице operations
Код: sql
1.
2.
3.
4.
 (select sum(f.Quantity) from operations f where f.operName='realiz' and f.operDate<#7/23/15# and f.prodID=a.prodID) AS bRealiz,
                                    (select sum(f.Quantity) from operations f where f.operName='prihod' and f.operDate<#7/23/15# and f.prodID=a.prodID) AS bPrihod,
                                    (select sum(f.Quantity) from operations f where f.operName='spisanie' and f.operDate<#7/23/15# and f.prodID=a.prodID) AS bSpisanie,
                                    (select sum(f.Quantity) from operations f where f.operName='vozvrat' and f.operDate<#7/23/15# and f.prodID=a.prodID) AS bVozvrat,


я получаю движение товара до нужной даты, чтобы рассчитать остаток на начало периода - 23.07.2015 (остаток на начало месяца + движение до нужной даты "23.07.2015")
И заключительная серия запросов
Код: sql
1.
2.
3.
4.
                                    SUM (IIF(b.operName='realiz', b.Quantity, 0)) AS Realiz,
                                    SUM (IIF(b.operName='prihod', b.Quantity, 0)) AS Prihod,
                                    SUM (IIF(b.operName='spisanie',  b.Quantity, 0)) AS Spisanie,
                                    SUM (IIF(b.operName='vozvrat', b.Quantity, 0)) AS Vozvrat


Рассчитывает уже само движение товара в нужном периоде (23.07.2015 - 30.07.2015)
...
Рейтинг: 0 / 0
26.10.2015, 21:33
    #39087407
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли оптимизация запроса ?
Евген987,
А Вы не желаете показать БД (меня гложут смутные сомнения насчет структуры и вкратце задачи базы)
...
Рейтинг: 0 / 0
27.10.2015, 12:06
    #39087821
Возможна ли оптимизация запроса ?
Какая цель группировки по полю Quantity таблицы remains? Можно ли без него обойтись?
(Кстати, без одной группировки по prodName точно можно обойтись, применив First(prodName))
У вас обороты считаются с учетом этой группировки и только для remains.periodID=1, а вход. остатки считаются без этих условий. Так и задумано? Если у таблицы operations заменить #7/23/15# and #7/30/15# на <= #7/30/15# и в SUM (IIF(...)) добавить условие < #7/23/15#, то вход. остаток будет не тот, что возвращает подзапрос?
...
Рейтинг: 0 / 0
27.10.2015, 12:55
    #39087912
Возможна ли оптимизация запроса ?
может, как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TRANSFORM SUM(b.Quantity)
SELECT a.prodID, a.prodName, c.Quantity

FROM
products a,
(SELECT * FROM remains WHERE remains.periodID=1) c,
(SELECT operName,prodID,Quantity FROM operations WHERE operDate between #7/23/15# and #7/30/15#
 UNION ALL
 SELECT "b" & operName,prodID,Quantity FROM operations WHERE operDate<#7/23/15#) b,
a LEFT JOIN b ON a.prodID=b.prodID,
a LEFT JOIN c ON a.prodID=c.prodID

GROUP BY
a.prodID, a.prodName, c.Quantity

PIVOT operName 
IN ('Realiz','Prihod','Spisanie','Vozvrat','bRealiz','bPrihod','bSpisanie','bVozvrat')
...
Рейтинг: 0 / 0
27.10.2015, 14:50
    #39088096
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли оптимизация запроса ?
непоймучка,

ШИКАРНО !!!
...
Рейтинг: 0 / 0
27.10.2015, 14:56
    #39088102
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли оптимизация запроса ?
непоймучка,

Можешь немного разжевать свой запрос, а то не совсем понимаю как решение получается...
...
Рейтинг: 0 / 0
27.10.2015, 15:30
    #39088145
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли оптимизация запроса ?
непоймучка,

Всё понял, дошло !
Спасибо большушее !!!
Вы делаете мир лучше !!!
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Возможна ли оптимизация запроса ? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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