-Поиск по дневнику

Поиск сообщений в rss_sql_ru_access_programming

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.03.2006
Записей:
Комментариев:
Написано: 4


Возможна ли оптимизация запроса ?

Понедельник, 26 Октября 2015 г. 20:52 + в цитатник
Вот весь запрос, он работает как надо, но есть предположение, что его выполнение можно оптимизировать...
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
 (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")
И заключительная серия запросов
                                    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)

http://www.sql.ru/forum/1181854/vozmozhna-li-optimizaciya-zaprosa


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку