2014-03-25 48 views
0

我正在使用SQL Server 2012, 如何通過sql腳本/ tsql實現表1的以下(表2)輸出?如何計算當前年份的新年數的總和

表1:當前場景

-------------------------------------------------- 
    Year ReferredEachYear ActiveEachYear 
-------------------------------------------------- 
    2014 297     179   
    2013 321     144   
    2012 354     123   
    2011 317     90   
    2010 292     72   
-------------------------------------------------- 

表2:預期產出

------------------------------------------------------------------------- 
    Year ReferredEachYear ActiveEachYear TotalActiveInSystem 
------------------------------------------------------------------------- 
    2014 297      179   608 
    2013 321      144   429 
    2012 354      123   285 
    2011 317      90   162 
    2010 292      72   72 
-------------------------------------------------------------------------- 
+2

變化時,SQL服務器2008年到SQL服務器2012年整個文檔,因爲這個問題明確規定的OP使用2012(以及它是否有差別的答案)。 –

+0

TotalActiveInSystem如何計算? – AK47

回答

4

如果您正在使用SQL Server 2012,那麼你可以使用累積和功能:

select cs.*, 
     sum(cs.ActiveEachYear) over (order by cs.[year]) as TotalActiveInSystem 
from CurrentScenario cs 
order by cs.[year] desc; 

此功能在早期版本的SQL Server中不可用。你將不得不在這些版本中使用其他方法(我會使用相關的子查詢)。

3
SELECT T.Year, 
     T.ReferredEachYear 
     T.ActiveEachYear 
     (SELECT SUM(ActiveEachYear) FROM YourTable WHERE YourTable.Year <= t.Year) AS TotalActiveinSystem 
FROM yourTable T 
+0

爲什麼我得到了大拇指? – Bobby

+0

我認爲這只是一個系列downvoter,因爲我的答案也是downvoted。 –

+0

哦,歡呼聲 – Bobby

1

正如戈登已經指定的那樣,在SQL Server 2012中,您可以使用累積求和函數。爲了便於理解查詢可以重寫如下。

SELECT cs.* 
     ,SUM(cs.ActiveEachYear) OVER 
     (ORDER BY cs.[year] 
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS TotalActiveInSystem 
    FROM CurrentScenario cs 
    ORDER BY cs.[year] DESC; 

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW此聲明被稱爲窗口框架。此查詢和@ Gordon的答案中的一個將產生相同的結果。如果只指定ORDER BY,則隱式定義計算的窗口框架。

通過使用成幀定義,您可以限制受操作影響的行。

OVER()條款http://technet.microsoft.com/en-us/library/ms189461.aspx

+0

感謝您的詳細信息 – arm

相關問題