2013-11-21 60 views
0

所以我有以下查詢:SQL服務器 - TSQL:累計計數

Select Year(DATEADD(MONTH,3,date)) as Year, Month(DATEADD(MONTH,3,date)) as Month, location, COUNT (agent_login_id) 
from Agents 
where Location = 'syd' 
Group by Location, Year(DATEADD(MONTH,3,date)), Month(DATEADD(MONTH,3,date)) 

它輸出:

Year Month location Count 

2013 1 SYD 1 
2013 3 SYD 11 
2013 4 SYD 2 
2013 5 SYD 2 
2013 8 SYD 3 
2013 9 SYD 1 
2013 10 SYD 4 
2013 11 SYD 7 
2013 12 SYD 7 
2014 1 SYD 3 
2014 2 SYD 1 

但我需要做的累積計數因此,例如,這是我需要什麼它看起來像

Year Month location Count Cumulative count 
2013 1 SYD 1   1 
2013 3 SYD 11   12 
2013 4 SYD 2   14 

我該怎麼做?

+0

版本SQL Server? –

+1

不要把你的最後一個數字作爲14? –

+0

版本是2008 R2 - 和數字應該是14你的權利 – user2034164

回答

1

我會用@t代表你當前的查詢

對於我稱之爲 '完全積累'(基於原來的問題)

-- 2012 
;WITH t AS 
(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY l ORDER BY y, m) 
    FROM @t 
) 
SELECT y, m, c, ISNULL(a + LAG(a,2) OVER(PARTITION BY l ORDER BY y, m), a) a 
FROM (
    SELECT t1.y, t1.l, t1.m, t1.c, SUM(t2.c) a 
    FROM t t1 
    JOIN t t2 ON t2.rn <= t1.rn AND t2.l = t1.l 
    GROUP BY t1.y, t1.l, t1.m, t1.c 
) t 

-- 2005+ 
;WITH t AS 
(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY l ORDER BY y, m) 
    FROM @t 
) 
SELECT t1.y, t1.l, t1.m, t1.c, ISNULL(SUM(t2.c)+SUM(t3.c), MIN(t1.c)) a 
FROM t t1 
JOIN t t2 ON t2.rn <= t1.rn AND t2.l = t1.l 
LEFT JOIN t t3 ON t3.rn < t2.rn-1 
GROUP BY t1.y, t1.l, t1.m, t1.c 

編輯

對於正常運行總數(問題糾正後)

--2005+ 
;WITH t AS 
(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY l ORDER BY y, m) 
    FROM @t 
) 
SELECT t1.y, t1.l, t1.m, t1.c, SUM(t2.c) a 
FROM t t1 
JOIN t t2 ON t2.rn <= t1.rn AND t2.l = t1.l 
GROUP BY t1.y, t1.l, t1.m, t1.c 

注意:如果在當前的查詢,你計算的,而不是使用YEAR()MONTH()(離開這些計算到如果需要的話結束)該月的第一天,那麼你可以儘量避免使用ROW_NUMBER()可以看到一些性能改進