2014-04-30 107 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中累積和不需要該子句」。並不完全正確。它可能會對結果產生影響,並會影響性能。 –