运行 总共使用了 over 子句
Running total using over clause
我是 运行 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 Fiddle 使用 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 Server Management Studio 中,在 SQL Server 2008 数据库上,我使用相同的查询、相同的 table 结构和数据得到以下错误。
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
或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
我是 运行 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 Fiddle 使用 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 Server Management Studio 中,在 SQL Server 2008 数据库上,我使用相同的查询、相同的 table 结构和数据得到以下错误。
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
或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