2012-10-31 46 views
9

我有一个月的每个交易日的销售预算。所以1天的预算是300,第2天的预算是400,然后月初至今的预算是700。我在查询得到这个错误:Incorrect syntax near 'ROWS'.使用OVER()的“语法错误”错误()

select 
TradingDate 
,Budget 
,sum(Budget) over (PARTITION BY TradingDate 
order by TradingDate asc 
ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING),1) AS BudgetMTD 
from #4 
+10

即2012语法。您可能正在使用较早的版本。 (虽然你在那里也有一个无与伦比的',1)'。 –

+0

是的,我使用2008年,感谢将调查 – Wilest

+0

对于2008年见http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver –

回答

2

您的查询正在各的总和当天的金额,同一天内的下一笔金额(您的分区和订单在同一个字段中)。这是允许的,但它表示三件事之一:

  1. TradingDate是一个日期,每个日期有多个值。如果是这样,那么这个总数是不确定的,因为你不知道哪一个会跟随。
  2. TradingDate名称很差,它确实是一个日期时间。在这种情况下,您将在同一日期获取下一个日期时间值。
  3. 您的查询是错误的,您并不真正的意思是“由TradingDate按TradingDate排序”。

我会推测你想要两件事之一。第一个是一天预算与第二天的总和。另一个是累计总和。

有可能您每天有多行,并且您希望当天的预算总和。如果是这样的话,那么你可以使用更简单的配方:

select TradingDate, Budget, 
     sum(Budget) over (PARTITION BY TradingDate) AS BudgetMTD 
from #4 
2

好吧,我想出了一个子查询解决方案:

select TradingDate, Budget, 
RunningTotal = (select sum(Budget) from #4 s2 
where s2.TradingDate<= s1.TradingDate) 
from #4 s1 
order by s1.TradingDate