2017-02-24 35 views
5

运行总我运行SQL Server 2008,我正在试图理解过子句的更多,我以前只是用row_number()使用它,我了解到,你可以使用集合函数与它建立事情就像一场比赛。使用在第

我创建了下面的测试数据库。

CREATE TABLE sales 
(
    employee nvarchar(50), 
    sales decimal(18, 2), 
    datesale datetime 
); 

Insert into sales Values('John','54.23','2017-01-30 08:00:00.000') 
Insert into sales Values('John','123.96','2017-01-30 09:00:00.000') 
Insert into sales Values('John','534.20','2017-01-30 10:00:00.000') 
Insert into sales Values('Ben','98.34','2017-01-29 04:00:00.000') 
Insert into sales Values('Ben','126.32','2017-01-29 05:00:00.000') 

并用下面的查询创建运行总和为每个员工使用SQL Server 2008,我得到下面的结果

| employee | sales |     datesale | mvgsum | 
|----------|--------|---------------------------|--------| 
|  Ben | 98.34 | January, 29 2017 04:00:00 | 98.34 | 
|  Ben | 126.32 | January, 29 2017 05:00:00 | 224.66 | 
|  John | 54.23 | January, 30 2017 08:00:00 | 54.23 | 
|  John | 123.96 | January, 30 2017 09:00:00 | 178.19 | 
|  John | 534.2 | January, 30 2017 10:00:00 | 712.39 | 

然而,在SQL

select 
    employee, sales, datesale, 
    SUM(sales) over (partition by employee order by datesale) as mvgsum 
from sales 

在SQL小提琴Server Management Studio中,一个SQL Server 2008数据库上,我使用了相同的查询,使用相同的表结构和数据得到下面的错误。

附近有语法错误 '秩序'。

可能是什么造成的?

+0

,我使用的是2014年,这也是这个查询工作正常。 – Mansoor

+1

Aggregade以上条款在2012年推出了它不会在2008年工作,我与2008年工作时遇到了类似的事情 –

回答

5

SUM() OVER()不支持SQL Server 2008中

你可以使用相关子查询:

select employee, 
    sales, 
    datesale, 
    (
     select sum(sales) 
     from sales s2 
     where s1.employee = s2.employee 
      and s2.datesale <= s1.datesale 
     ) mvgsum 
from sales s1 

或者CROSS APPLY

select employee, 
    sales, 
    datesale, 
    x.mvgsum 
from sales s1 
cross apply (
    select sum(sales) mvgsum 
    from sales s2 
    where s1.employee = s2.employee 
     and s2.datesale <= s1.datesale 
    ) x