2011-11-03 71 views
1

我有一個相當複雜的查詢(大約需要30秒執行)返回我下面的數據集:在SQL查詢中積累列

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服務器,但我的compability級別設置爲80(如MSSQL 2000,我無法改變這一點)。所以我覺得我只駕駛一檔法拉利。 );

+0

從第一個查詢返回的數據集有多大,但沒有運行總數?另外什麼是「月」列的數據類型? –

+0

嘗試使用谷歌搜索「sqlserver running sum」 – Andomar

+0

Monht是一個varchar列,但如果datetime使它更快,我會爲它付出。 第一次查詢只返回13行,但原始表有近2MM記錄。我正在使用這個小組來進行一些現金流動。 – vbandrade

回答

2

對於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 
+0

謝謝馬丁! 使用您的解決方案,基本查詢需要00:27,最終結果爲1:29。大部分時間是將數據插入@Results。 – vbandrade

2

說完看了這個,我想你可能從CTE中受益(假設你可以使用那些與COM級別設置爲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 
+0

可以使用SQL Server 2000中的視圖或派生表來模擬CTE,但是它們不會**先物化,所以自加入很可能最終會花費兩次昂貴的聚合。 –

+0

謝謝Jamien!使用您的解決方案,基本查詢需要00:27,最終結果爲1:47。非常接近馬丁的解決方案。我接受他的回答,因爲他第一回答。 – vbandrade

+0

@vbandrade - 這很有趣,與我之前的評論完全矛盾!在這種情況下,SQL Server是否爲計劃添加了一個假脫機程序? –