Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL累积计数_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL累积计数

SQL累积计数,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一张部门的桌子。我需要数一数哪个部门有多少人。这很容易做到 SELECT DEPT, COUNT(*) as 'Total' FROM SR GROUP BY DEPT; 现在我还需要做如下累积计数: 我找到了一些SQL来计算运行总数,但不是像这样的情况。在这种情况下,您能给我一些建议吗?我认为您可以使用一些临时/变量表,并使用以下解决方案: 还有其他一些解决方案,但我认为这是SQL Server 2008最快的解决方案。这里有一种使用CTE而不是光标的方法:

我有一张部门的桌子。我需要数一数哪个部门有多少人。这很容易做到

SELECT DEPT,
       COUNT(*) as 'Total'
    FROM SR
    GROUP BY DEPT;
现在我还需要做如下累积计数:


我找到了一些SQL来计算运行总数,但不是像这样的情况。在这种情况下,您能给我一些建议吗?

我认为您可以使用一些临时/变量表,并使用以下解决方案:


还有其他一些解决方案,但我认为这是SQL Server 2008最快的解决方案。

这里有一种使用CTE而不是光标的方法:

WITH Base AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY [Count] DESC) RowNum,
    [Dept],
    [Count]
    FROM SR
)
SELECT SR.Dept, SR.Count, SUM(SR2.[Count]) Total
FROM Base SR
INNER JOIN Base SR2
    ON SR2.RowNum <= SR.RowNum
GROUP BY SR.Dept, SR.Count
ORDER BY SR.[Count] DESC
请注意,这是按递减计数排序,就像示例结果一样。如果有其他列没有显示,应该用于排序,只需替换每个ORDERBY子句中的Count


你们能为你们的表添加模式吗?或者你们有主键吗?我猜在你们输入问题时,这个线程并没有提供给你们。顺便说一句,我的google搜索字符串是,sql server运行总计。@Dhaval-由于数据正在通过SCD进行历史记录,因此没有PK或行号。如果您不知道术语“运行总计”,您可以很好地搜索sql server累积计数,这也会给您很多建议。@ypercube是一篇不错的文章,谢谢,但实际上,在本文中,游标方法比CTE慢2倍,但它的I/O操作更少是的,对,我看错了图片。在我的记忆中,我确信情况正好相反。也许我放弃了CTE方法,因为它需要通过临时表和标识获得的连续数字。再次链接到这些评论中讨论的文章:@ypercube是的,cte的代码比光标少一点,但它需要数字/其他键,而不需要空格。这非常适合我的需要。是否有可能在累积计数旁边轻松添加另一个派生列,该列将计算每行的累积计数/总和[每行所有部门]?在累积计数/254的意义上。结果应该显示为百分比。完成,我自己找到。再次感谢,谢谢你的帮助!
WITH Base AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY [Count] DESC) RowNum,
    [Dept],
    [Count]
    FROM SR
)
SELECT SR.Dept, SR.Count, SUM(SR2.[Count]) Total
FROM Base SR
INNER JOIN Base SR2
    ON SR2.RowNum <= SR.RowNum
GROUP BY SR.Dept, SR.Count
ORDER BY SR.[Count] DESC