2013-11-21 3 views
0

Поэтому у меня есть следующий запрос:SQL Server - 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

Dont u означает 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(), которые могут видеть некоторые улучшения производительности

Смежные вопросы