Sql server 2008 r2 SQL 2008累积计数

Sql server 2008 r2 SQL 2008累积计数,sql-server-2008-r2,cumulative-sum,Sql Server 2008 R2,Cumulative Sum,我有一个查询,返回按日期分组的行数: SELECT convert(date, run.TimeStamp) as TimeStamp, count(*) FROM ScriptResult AS res INNER JOIN ScriptRun AS run ON run.ScriptRunID = res.ScriptRunID INNER JOIN WorkListItems AS wli ON wli.WorkListItemID = res.WorklistItem

我有一个查询,返回按日期分组的行数:

SELECT  convert(date, run.TimeStamp) as TimeStamp, count(*)
FROM  ScriptResult AS res INNER JOIN
    ScriptRun AS run ON run.ScriptRunID = res.ScriptRunID INNER JOIN
    WorkListItems AS wli ON wli.WorkListItemID = res.WorklistItemID INNER JOIN
    WorkList AS wl ON wl.WorkListID = wli.WorkListID
WHERE (wli.WorkListID = @WLID)
GROUP by convert(date, run.TimeStamp)
ORDER BY convert(date, run.TimeStamp);
这将生成如下结果集:

TimeStamp   (ItemCount)
2015-03-10  5364
2015-03-11  22027
2015-03-12  18037
TimeStamp   ItemCount   TotalCount
2015-03-10  5364    5364
2015 -03-11 22027   27391
2015-03-12  18037   45428
现在我想要的是累计汇总itemcount,如下所示:

TimeStamp   (ItemCount)
2015-03-10  5364
2015-03-11  22027
2015-03-12  18037
TimeStamp   ItemCount   TotalCount
2015-03-10  5364    5364
2015 -03-11 22027   27391
2015-03-12  18037   45428
该查询需要与2008R2兼容。 我在几个变体中使用了[count…over..partition by],但问题是窗口函数边界应该发生变化。我不能使用行或范围

有什么想法吗?
提前感谢。

您可以尝试创建一个临时表来保存第一个查询结果,您可以进一步聚合这些结果,以返回ItemCount字段上的累积总和:

CREATE TABLE #TempTable(
    [SeqNo] [int] NULL,
    [TimeStamp] [Date] NULL,
    [ItemCount] [int] NULL     
) ON [PRIMARY]

SELECT
    ROW_NUMBER() OVER (PARTITION BY res.ScriptRunID ORDER BY run.TimeStamp) AS SeqNo,
    CONVERT(Date, run.TimeStamp) AS TimeStamp, 
    COUNT(*) AS ItemCount
INTO #TempTable
FROM ScriptResult AS res 
INNER JOIN ScriptRun AS run 
    ON run.ScriptRunID = res.ScriptRunID 
INNER JOIN WorkListItems AS wli 
    ON wli.WorkListItemID = res.WorklistItemID 
INNER JOIN  WorkList AS wl 
    ON wl.WorkListID = wli.WorkListID
WHERE (wli.WorkListID = @WLID)
GROUP BY CONVERT(Date, run.TimeStamp)
ORDER BY CONVERT(Date, run.TimeStamp);

SELECT 
     t1.TimeStamp, 
     t1.ItemCount, 
     SUM(t2.ItemCount) AS TotalCount
FROM #TempTable AS t1
INNER JOIN #TempTable AS t2 
    on t1.SeqNo >= t2.SeqNo 
GROUP BY t1.TimeStamp, t1.ItemCount
ORDER BY t1.TimeStamp

注意:此链接指向Microsoft SQL Server 2014数据库版本SQL FIDLE,该版本也应适用于SQL Server 2008。

尝试使用相关子查询:

;WITH cte as(
               SELECT  convert(date, run.TimeStamp) as TimeStamp, count(*) AS S
               FROM  ScriptResult AS res INNER JOIN
                     ScriptRun AS run ON run.ScriptRunID = res.ScriptRunID INNER JOIN
                     WorkListItems AS wli ON wli.WorkListItemID = res.WorklistItemID INNER JOIN
                     WorkList AS wl ON wl.WorkListID = wli.WorkListID
               WHERE (wli.WorkListID = @WLID)
               GROUP by convert(date, run.TimeStamp)
)
SELECT TimeStamp, 
       S, 
       (SELECT SUM(S) FROM cte t2 WHERE t2.TimeStamp <= t1.TimeStamp) AS TS  
FROM cte  t1

谢谢,我会的谢谢,我会试试这个方法