2015-02-03 5 views
0

Im пытается генерировать общее количество по месяцам и годам. Я попробовал несколько примеров, но я не могу заставить его работать. Это SQL у меня есть, и я хотел бы создать нарастающий итог для колонки totalclientssql running total

Month| Year| TotalClients| Running Total 

Jan |2014| 1| 1 

Feb| 2014| 4| 5 

Mar| 2014| 8| 13 


select Month, Year, TotalClients 
From Total 

Это код, который я пытался использовать, ив использовал таблицу объявит как основной данные поступает из другого запроса но это должен быть бит, который вам нужен. Я также прокомментировал одну из из линий, как я пробуя как путь, то закомментирована линия была в несколько примеров на сети, но я не мог заставить его работать

select t1.monthstart, t1.yearstart, t1.TotalClients, sum(t2.TotalClients) as 'RunningTotal' 
from @Totals t1 inner join @Totals t2 on t1.monthstart = t2.monthstart and t1.yearstart = t2.yearstart 
--from @Totals t1, @Totals t2 
WHERE t1.MonthStart <= t2.MonthStart and t1.Yearstart <= t2.Yearstart 
GROUP BY t1.Yearstart, t1.MonthStart, t1.TotalClients 
ORDER BY t1.yearstart , t1.monthstart 
+1

Какая версия SQL Server? Кроме того, вы заявляете, что попробовали несколько примеров, вы должны включить этот код. Это может быть простое исправление для вашего текущего кода. – Taryn

+1

Возможно использование оконного набора, использующего что-то вроде 'Count (ClientID) over ( раздел на (год + месяц)' Вот еще другие варианты http://sqlperformance.com/2014/01/t-sql-queries/grouped-running- итоговые значения – xQbert

+0

@xQbert раздел по году + месяц, как правило, не очень хорошая идея. Попробуйте разделить на год, месяц, чтобы избежать 2014 + 01 = 2015 –

ответ

0

Этот запрос работает для SQL Server 2012 и выше. Я предположил Month числовой (январь = 1, февраль = 2, и т.д.)

SELECT *, 
     SUM(t.TotalClients) OVER (PARTITION BY t.[Year] ORDER BY t.[Month]) 
FROM @Totals t 

Это приведет к сбросу рассчитывать клиент, как только изменяется год. Чтобы сохранить ее, изменить положение SUM к

SUM(t.TotalClients) OVER (ORDER BY t.[Year], t.[Month]) 
+0

Текущая сумма будет работать только с 2012 года и до –

+0

дает мне ошибку «Неправильный синтаксис рядом с« заказом » «Моя версия Microsoft SQL Server 2008 R2 (SP2) – Codeek

+0

Моя неисправная память! Функции окна в недавних версиях SQL Server сильно изменились, поэтому сложно отслеживать, какая версия поддерживает то, что ответ обновлен. –

0

Как @xQbert писал в комментариях выше (я Советую прочитать, что статья), SQL Server «Оконная функции» является то, что вы хотите использовать в версии 2012+. Оконные функции являются гибкими и мощными и гораздо более эффективными, чем самосоединения.

В качестве фактического ответа, здесь будет какой-то возможный код для использования:

SELECT YearStart, MonthStart, 
    ClientCount = SUM(TotalClients) OVER (
     PARTITION BY YearStart, MonthStart 
     ORDER BY YearStart, MonthStart RANGE UNBOUNDED PRECEDING 
    ) 
FROM Totals t1 
ORDER BY YearStart, MonthStart 
+0

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

0

Я использовал это в конце концов, я добавил faulldate, чтобы упростить то, что я хотел, и он работал, я думаю, вопрос был в соединении, которое я использовал, было < = неправильный путь.

SELECT 
    st1.invoicestartdate, 
    st1.TotalClients, 
    RunningTotal = SUM(st2.TotalClients) 
FROM 
    @Totals AS st1 
INNER JOIN 
    @Totals AS st2 
    ON st2.invoicestartdate <= st1.invoicestartdate 
GROUP BY st1.invoicestartdate, st1.TotalClients 
ORDER BY st1.invoicestartdate; 
+1

собирался указать, что все видели предложение о функции окна, поэтому подумали, – Codeek