2013-10-14 61 views
3

我有部門表。我需要計算有多少人在哪個部門。這是很容易SQL累積計數

SELECT DEPT, 
     COUNT(*) as 'Total' 
    FROM SR 
    GROUP BY DEPT; 

做現在我需要做的還有如下累計計數:

enter image description here

我已經發現了一些SQL計算運行總計,但不區分贊一個。請問在這種情況下你能提供一些建議嗎?

+0

你可以添加你的表架構還是你有任何主鍵? – Dhaval

+1

我想這個帖子並沒有提供給你,因爲你輸入你的問題。 http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver順便說一句,我的谷歌搜索字符串是,「SQL服務器運行總數」。 –

+0

@Dhaval - 由於數據正在通過SCD進行歷史記錄,因此沒有PK或行號。 – DNac

回答

5

這裏是一種具有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即可。

SQL Fiddle Demo

+0

好極了,這對我的需求非常合適。是否還有可能在累積計數旁邊「輕鬆」添加另一個派生列,這會計算每行的(cumulative_count/sum [per_all_depts])?在cumulative_count/254的含義中。結果應以百分比顯示。 – DNac

+0

完成,自己找到它。再次感謝,感謝您的幫助! – DNac

3

我想你可以使用一些臨時/變量表對於這一點,並且使用的解決方案,從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 fiddle demo

裏有一些其他的解決方案,但是這一個是我認爲最快的是SQL Server 2008。

+0

@ypercube不錯的文章,謝謝,但實際上,在這篇文章中,光標方法比CTE慢2倍(但是它具有更少的I/O操作) –

+0

是的,對,我看錯了圖片。我確信(在我的記憶中)是相反的。也許我放棄了CTE方法,因爲它需要連續的數字(通過臨時表和IDENTITY)。再次鏈接到這些評論中討論的文章:[運行總計的最佳方法。](http://www.sqlperformance。 com/2012/07/t-sql-queries/running-totals) –

+0

@ypercube是的,cte比遊標少一點代碼,但它需要數字/其他鍵沒有間隙 –