我有部门的桌子。我需要计算有多少人在哪个部门。这很容易通过
SELECT DEPT,
COUNT(*) as 'Total'
FROM SR
GROUP BY DEPT;
现在我还需要做如下累积计数:
我发现了一些 SQL 来计算运行总数,但不是这样的情况。在这种情况下,你能给我一些建议吗?
我有部门的桌子。我需要计算有多少人在哪个部门。这很容易通过
SELECT DEPT,
COUNT(*) as 'Total'
FROM SR
GROUP BY DEPT;
现在我还需要做如下累积计数:
我发现了一些 SQL 来计算运行总数,但不是这样的情况。在这种情况下,你能给我一些建议吗?
这是一种使用 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
请注意,这是Count
像您的示例结果一样按降序排序。如果还有其他未显示的列应用于排序,则只需Count
在每个ORDER BY
子句中替换即可。
我认为您可以为此使用一些临时/变量表,并从此处使用解决方案:
declare @Temp table (rn int identity(1, 1) primary key, dept varchar(128), Total int)
insert into @Temp (dept, Total)
select
dept, count(*) as Total
from SR
group by dept
;with cte as (
select T.dept, T.Total, T.Total as Cumulative, T.rn
from @Temp as T
where T.rn = 1
union all
select T.dept, T.Total, T.Total + C.Cumulative as Cumulative, T.rn
from cte as C
inner join @Temp as T on T.rn = C.rn + 1
)
select C.dept, C.Total, C.Cumulative
from cte as C
option (maxrecursion 0)
还有一些其他的解决方案,但我认为这个对于 SQL Server 2008 来说是最快的。