我正在使用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:预期的OutPut
-------------------------------------------------------------------------
Year ReferredEachYear ActiveEachYear TotalActiveInSystem
-------------------------------------------------------------------------
2014 297 179 608
2013 321 144 429
2012 354 123 285
2011 317 90 162
2010 292 72 72
--------------------------------------------------------------------------
答案 0 :(得分: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中不可用。你将不得不在这些版本中使用其他方法(我会使用相关的子查询)。
答案 1 :(得分:3)
SELECT T.Year,
T.ReferredEachYear
T.ActiveEachYear
(SELECT SUM(ActiveEachYear) FROM YourTable WHERE YourTable.Year <= t.Year) AS TotalActiveinSystem
FROM yourTable T
答案 2 :(得分:1)
就像Gordon已经指定的那样,在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