计算运行总计

时间:2019-03-06 07:24:10

标签: sql-server

我想使用存储过程来计算运行总计。基本表约为10.000行,如下所示:

nWordNr nBitNr  tmTotals
------------------------
5       14      86404
5       14      146
2       3       438
10      2       3319
5       12      225
2       3       58
....    ....    .....
....    ....    .....

我希望这是GROUPED BY nWordNr, NBitNr,并且总数为tmTotals。为此,首先要执行以下操作:

SELECT TOP 10 
[nWordNr] as W, 
[nBitNr] as B,
SUM([tmTotals]) as total,
COUNT(*) as Amount

FROM Messages_History
GROUP BY nWordNr, nBitNr
ORDER BY total desc

结果是:

W   B   total     Amount
-----------------------
2   3   3578775   745
3   3   3557975   395
5   4   2305229   72
5   3   2183050   33
5   12  2022401   825
5   14  1673295   652
48  12  1658862   302
4   3   1606454   215
48  13  1541729   192
5   9   1463256   761

现在,我想像这样计算列total上的运行总计:

W   B   total     Amount   running
-------------------------------
2   3   3578775   745      3578775    
3   3   3557975   395      7136750
5   4   2305229   72       9441979
5   3   2183050   33       11625029
5   12  2022401   825      etc.
5   14  1673295   652      etc.
48  12  1658862   302      etc.
4   3   1606454   215      etc.
48  13  1541729   192      etc.
5   9   1463256   761      etc.

所以我发现的是:

COUNT([tmTotals]) over (ORDER BY [nWordNr], [nBitNr]) as Running

但是在这里,我得到了在这个问题中讨论的错误:Column invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause,在这种情况下,我只是想不通如何解决

1 个答案:

答案 0 :(得分:1)

应为SUM ( SUM ( tmTotals) ) OVER ( ... )

SELECT TOP 10 
       [nWordNr] as W, 
       [nBitNr] as B,
       SUM([tmTotals]) as total,
       COUNT(*) as Amount,
       SUM(SUM([tmTotals])) OVER (ORDER BY [nWordNr], [nBitNr]) as Running
FROM   Messages_History
GROUP BY nWordNr, nBitNr
ORDER BY total desc

编辑: 查看您的预期结果,Running应该是

SUM(SUM([tmTotals])) OVER (ORDER BY SUM([tmTotals]) DESC) as Running

如果上面的内容很难理解,那么您可以使用CTE或派生表并在外部查询上执行运行总计

; with CTE as
(
    SELECT 
         [nWordNr] as W, 
         [nBitNr] as B,
         SUM([tmTotals]) as total,
         COUNT(*) as Amount
    FROM Messages_History
    GROUP BY nWordNr, nBitNr
)
SELECT TOP 10 *, 
       SUM(total) OVER (ORDER BY total desc) as Running
FROM   CTE
ORDER BY total desc