Накопление столбца в запросе SQL - PullRequest
1 голос
/ 03 ноября 2011

У меня довольно сложный запрос (для его выполнения требуется около 30 секунд), который возвращает мне следующий набор данных:

 Month     Buy     Sell
2010/10     1        2
2010/11     1        3
2010/12     2        5

А вот запрос:

select month, avg(buy) [buy], avg(sell) [sell] from products group by month order by month

Теперь яЯ хочу добавить два накопленных столбца, и ожидаемый результат будет следующим:

 Month   Ac. Buy   Ac. Sell
2010/10     1          2
2010/11     2          5
2010/12     4          10

Я пытаюсь использовать этот запрос

select 
distinct x.month
,(select SUM(buy) from products where month <= x.month) [Ac Buy]
,(select SUM(sell) from products where month <= x.month) [Ac Sell]
from products X
order by x.month

Но это занимает слишком много времени!

Есть ли способ сделать это быстрее?

Я использую MS SQL 2008 Server, но мой уровень совместимости установлен на 80 (как MSSQL 2000, и я не могу это изменить).Поэтому я чувствую, что я за рулем Ferrari, используя только 1-ю передачу.);

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Посмотрев на это, я думаю, что вы могли бы извлечь выгоду из CTE (при условии, что вы можете использовать те, для которых Com Level установлен на 80 ....)

Начните с CTE, который собирает ваши исходные данные, изатем присоедините результаты cte к себе, чтобы иметь возможность суммировать средние значения:

;with productsCTE
as
(
  -- Original query!
  select month, AVG(buy) buy, AVG(sell) sell 
  from products 
  group by mnth 
)
select 
    p1.month,
    p1.buy,
    SUM(p2.buy) sumavgbuy,
    p1.sell,
    SUM(p2.sell) sumavgsell
from productsCTE p1
inner join productsCTE p2 on p2.month <= p1.month
group by p1.month,p1.buy,p1.sell
2 голосов
/ 03 ноября 2011

Для 13 строк я просто материализую промежуточные результаты в табличную переменную, а затем выполняю треугольное соединение с этим.

DECLARE @Results TABLE
(
Month char(7) PRIMARY KEY,
Buy int,
Sell int
)

INSERT INTO @Results /*Your select query goes here*/
SELECT '2010/10',1,2 UNION ALL
SELECT '2010/11',1,3 UNION ALL
SELECT '2010/12',2,5

SELECT R1.Month,
       R1.Buy,
       R1.Sell,
       SUM (R2.Sell)AS AcSell,
       SUM (R2.Buy) AS AcBuy 
FROM @Results R1
JOIN @Results R2 ON R2.Month <= R1.Month
GROUP BY R1.Month,
       R1.Buy,
       R1.Sell
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...