如何计算当前到前几年的新列的年份总和

时间:2014-03-25 11:30:58

标签: sql sql-server tsql sql-server-2012

我正在使用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 
--------------------------------------------------------------------------

3 个答案:

答案 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

的整个文档
相关问题