MS Access - подзапрос с промежуточным итогом с использованием DSUM с фильтром - PullRequest
2 голосов
/ 07 марта 2019

Чтобы сгенерировать итоговый объем продаж в MS Access, я использовал запрос ниже, он работает как положено

SELECT ID, [Product Line], DSUM("[Qty]","[SalesData]","[Product Line] like '*Electronics*' AND [ID] <=" & [ID]) AS RunningTotal, FROM SalesData WHERE ([Product Line]) Like '*Electronics*';

Теперь мне нужно отфильтровать все записи с помощью RunningTotal <100, Я выполнил следующий подзапрос </p>

SELECT * FROM( 
SELECT ID, [Product Line], DSUM("[Qty]","[SalesData]","[Product Line] like '*Electronics*' AND [ID] <=" & [ID]) AS RunningTotal, FROM SalesData WHERE ([Product Line]) Like '*Electronics*')
DSUM("[Qty]","[","[Product Line] like '*Electronics*' AND [ID] <=" & [ID]) < 100;

Он не работает, и таблица много раз зависает при выполнении этого запроса

Таблица данных

ID    Product Line           Qty     RunningTotal
1     Electronics            15            15   
2     R.K. Electricals       20            20
3     Samsung Electronics    10            25
4     Electricals            30            50
5     Electricals            45            95
6     Electronics Components 18            43
7     Electricals            25           120
8     Electronics            50            93
9     Electricals Machines   65           185
10    Electronics            15           108
11    ABC Electronics Ltd    52           160
12    Electricals            15           200

Здесь RunningTotal - это вычисляемое поле (не поле таблицы) Электрооборудование RunningTotal другое, а электроника RunningTotal другое

Ожидаемый выход для линейки продуктов как Электроника с RunningTotal <100 </p>

ID    Product Line           Qty     RunningTotal
1     Electronics            15            15   
3     Samsung Electronics    10            25
6     Electronics Components 18            43
8     Electronics            50            93

Не могли бы вы помочь мне исправить вышеуказанный запрос?

Заранее спасибо.

1 Ответ

3 голосов
/ 07 марта 2019

Вместо того, чтобы использовать агрегатные функции домена (такие как DSum), которые, как известно, являются заведомо медленными, я бы предложил использовать коррелированный подзапрос, такой как следующее:

select q.* from
(
    select t.id, t.[product line], t.qty, 
        (
            select sum(u.qty) 
            from salesdata u 
            where u.[product line] = t.[product line] and u.id <= t.id
        ) as runningtotal
    from salesdata t
    where t.[product line] like "*Electronics*"
) q
where q.runningtotal < 100

РЕДАКТИРОВАТЬ:

select t.*, q.runningtotal from salesdata t inner join
(
    select t.id, 
        (
            select sum(u.qty) 
            from salesdata u 
            where u.[product line] like "*Electronics*" and u.id <= t.id
        ) as runningtotal
    from salesdata t
) q on t.id = q.id
where q.runningtotal < 100 and t.[product line] like "*Electronics*"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...