sql - 使用 over 子句运行总计

标签 sql sql-server sql-server-2008 window-functions

我正在运行 SQL Server 2008,我目前正在尝试更多地了解 over 子句,我以前使用过它,但只是与 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')

并使用以下查询为每个员工创建运行总和

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

在使用 SQL Server 2008 的 SQL Fiddle 上,我得到以下结果

 | 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 Server Management Studio 中的 SQL Server 2008 数据库上,我使用相同的查询、相同的表结构和数据收到以下错误。

Incorrect syntax near 'order'.

这可能是什么原因造成的?

最佳答案

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

交叉应用:

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

关于sql - 使用 over 子句运行总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42431141/

相关文章:

SQL Server 查找并替换特定列的所有行中的特定单词

tsql - 有没有办法在 T-SQL 中快速复制记录?

c# - 帮助将 sql 查询转换为 LINQ

sql - 在同一查询中求和并连接列数据

sql - INSERT 查询错误 : Implicit conversion from data type varchar to varbinary is not allowed. 使用 CONVERT 函数运行此查询。

c# - 林克 2 SQL : composite primary key

如果在另一列中,则基于总和的Mysql平均值

mysql - 将查询 SQL 转换为 PostgreSQL

SQL Server Management Studio 无法连接到 Sql Server

c# - 我安装的应用程序不工作