2014-04-30 73 views
1

我试图使用方法无界前述的行...按how to get cumulative sumSQL累积总误差Server 2012中

我运行MS Server 2012的

的查询使用在创建表CTE [TBL2]:

SELECT [RowID] 
     , [GroupID] 
     , [NumericalData] 
     , Sum([NumericalData]) 
     Over (Partition By [GroupID] 
     order by [RowID] 
     ROWS between UNBOUNDED PRECEDING and CURRENT ROW) as Cumulative 

    FROM TBL2 
    GROUP BY [ROWid] 
    , [groupID] 
    , [NumericalData] 
    Order By ROW 

我得到以下错误消息: 消息102,级别15,状态1,行103 附近有语法错误 '行'。

任何人知道我在做什么错了?

在此先感谢

+0

看起来它应该为你工作,除了最后一组by/order by。这个小组是否真的有必要?你有一个名为'ROW'的列吗? –

+1

它看起来并不像你使用的是SQL Server 2012. select @@ version'告诉你什么? –

+0

我得到的Microsoft SQL Server 2008 R2(SP2) - 在Windows NT上10.50.4000.0(X64) \t 2012年6月28日8点36分三十秒 \t版权所有(c)Microsoft公司 \t快捷版(64位)6.1 (内部版本7601:Service Pack 1) – RobTovey

回答

1

SQL语句中的累积和不需要该子句。另外:

  • 您正在混合group by与窗口功能。尽管允许,但这可能不是你真正想要的。
  • 您的order by无效。

也许这就是你想要什么:

SELECT [RowID], [GroupID], [NumericalData], 
     Sum([NumericalData]) Over (Partition By [GroupID] order by [RowID]) as Cumulative 
FROM TBL2 
ORDER BY [RowID]; 

编辑:

我要注意的是,原来的查询(与order by条款固定)确实在SQL Fiddle工作。也许问题是SQL Server的版本。

+1

如果您省略'rows'子句,则使用默认值,即'range'。如果每个“GroupID”的'RowID'不唯一,您将得到不同的结果。除非你真的想要'range'产生的结果,否则出于性能原因你应该使用'rows'。 –

+0

@MikaelEriksson。 。 。我怀疑这个查询实际上并不是OP想要的。按数字值进行聚合,然后将其包含在累积和中将不是常用操作。 –

+0

同意最终的小组不是他想要的,也可能不是这两个的顺序,至少不是这样。只是想指出“SQL Server中累积和不需要该子句”。并不完全正确。它可能会对结果产生影响,并会影响性能。 –