我有部門表。我需要計算有多少人在哪個部門。這是很容易SQL累積計數
SELECT DEPT,
COUNT(*) as 'Total'
FROM SR
GROUP BY DEPT;
做現在我需要做的還有如下累計計數:
我已經發現了一些SQL計算運行總計,但不區分贊一個。請問在這種情況下你能提供一些建議嗎?
我有部門表。我需要計算有多少人在哪個部門。這是很容易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
喜歡你的樣品結果並訂購。如果還有一些未顯示的列應該用於訂購,則只需在ORDER BY
條款中分別替換Count
即可。
我想你可以使用一些臨時/變量表對於這一點,並且使用的解決方案,從here:
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。
@ypercube不錯的文章,謝謝,但實際上,在這篇文章中,光標方法比CTE慢2倍(但是它具有更少的I/O操作) –
是的,對,我看錯了圖片。我確信(在我的記憶中)是相反的。也許我放棄了CTE方法,因爲它需要連續的數字(通過臨時表和IDENTITY)。再次鏈接到這些評論中討論的文章:[運行總計的最佳方法。](http://www.sqlperformance。 com/2012/07/t-sql-queries/running-totals) –
@ypercube是的,cte比遊標少一點代碼,但它需要數字/其他鍵沒有間隙 –
你可以添加你的表架構還是你有任何主鍵? – Dhaval
我想這個帖子並沒有提供給你,因爲你輸入你的問題。 http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver順便說一句,我的谷歌搜索字符串是,「SQL服務器運行總數」。 –
@Dhaval - 由於數據正在通過SCD進行歷史記錄,因此沒有PK或行號。 – DNac