2017-02-24 18 views
5

Tôi đang chạy SQL Server 2008, hiện tại tôi đang cố gắng hiểu điều khoản trên, tôi đã sử dụng nó trước đây nhưng chỉ với row_number() và tôi đã học được bạn có thể sử dụng các hàm tổng hợp với nó và tạo những thứ như tổng số đang chạy.Chạy tổng số bằng cách sử dụng khoản trên

Tôi đã tạo cơ sở dữ liệu thử nghiệm sau.

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') 

Và sử dụng các truy vấn sau đây để tạo ra một khoản tiền chạy cho mỗi nhân viên

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

Mở SQL Fiddle sử dụng SQL Server 2008 tôi nhận được kết quả như sau

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

Tuy nhiên, trong SQL Server Management Studio, trên cơ sở dữ liệu SQL Server 2008, tôi nhận được lỗi sau bằng cách sử dụng cùng một truy vấn, với cùng cấu trúc bảng và dữ liệu.

Cú pháp không đúng gần 'trật tự'.

Điều gì có thể gây ra điều này?

+0

, Tôi đang dùng 2014, nó cũng là truy vấn này hoạt động tốt. – Mansoor

+1

Điều khoản tổng hợp được giới thiệu vào năm 2012. Nó sẽ không hoạt động vào năm 2008. Tôi đã đối mặt với điều tương tự khi làm việc với năm 2008 –

Trả lời

5

SUM() OVER() không được hỗ trợ trong SQL Server 2008.

Bạn có thể sử dụng một subquery tương quan:

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

Hoặc 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 
Các vấn đề liên quan