2014-09-15 5 views
0

Выборочные данные в tblData:Накопительное Добавление в SQL Server 2008

RowID SID Staken DateTaken 
--------------------------------------------- 
1  1 1  2014-09-15 14:18:11.997 
2  1 1  2014-09-16 14:18:11.997 
3  1 1  2014-09-17 14:18:11.997 

Я хотел бы получить количество daywise СВДС, а также накопленную сумму как

Date  ThisDayCount TotalCount 
----------------------------------- 
2014-09-15  1    1 
2014-09-16  10   11 
2014-09-17  30   41 

Это то, что я сейчас в моей хранимой процедуре с началом & параметры даты окончания. Есть ли более элегантный способ сделать это?

;WITH TBL AS 
(
    SELECT 
     CONVERT(date, asu.DateTaken) AS Date, 
     COUNT(*) AS 'ThisDayCount' 
    FROM 
     tblData asu 
    WHERE 
     asu.SID = 1 
     AND asu.STaken = 1 
     AND asu.DateTaken >= @StartDate 
     AND asu.DateTaken <= @EndDate 
    GROUP BY 
     CONVERT(date, asu.DateTaken) 
) 
SELECT 
    t1.Date, t1.ThisDayCount, SUM(t1.ThisDayCount) AS 'TotalCount' 
FROM 
    TBL t1 
INNER JOIN 
    TBL t2 ON t1.date >= t2.date 
GROUP BY 
    t1.Date, t1.ThisDayCount 
+1

Это исчерпывающе описано Аароном Бертраном здесь: http://sqlperformance.com/2012/07/t-sql-queries/running-totals Суть - это самый лучший подход до 2012 года. – JNK

ответ

1

Я не знаю более элегантного способа сделать это, кроме, возможно, с подзапросом для вашей общей суммы. То, что у вас есть, довольно элегантно по стандартам T-SQL.

Но, в зависимости от того, сколько записей вам необходимо обработать и как выглядят ваши индексы, это может быть очень медленным. Вы не говорите, что такое назначение этой информации, но если это какой-то отчет или веб-страница, я бы подумал о том, чтобы выполнить общее количество как часть обработки в месте назначения, а не в базе данных.

+0

Спасибо, много – Qwerty

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