Sql server 在SQL Server 2012中使用总和和超过运行总计不起作用

Sql server 在SQL Server 2012中使用总和和超过运行总计不起作用,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一群加薪的员工。一名员工可以多次加薪,每次加薪的原因不同。一名员工不能因同一原因多次加薪,因此EmployeeID和RaiseReason的组合是唯一的 每次加薪后,我需要记录每个员工的工资总额 因此,我: SELECT EmployeeID, CurrentSalary, RaiseAmount, RaiseReason, CurrentSalary + SUM(RaiseAmount) OVER (PARTITION BY EmployeeID, RaiseReaso

我有一群加薪的员工。一名员工可以多次加薪,每次加薪的原因不同。一名员工不能因同一原因多次加薪,因此
EmployeeID
RaiseReason
的组合是唯一的

每次加薪后,我需要记录每个员工的工资总额

因此,我:

SELECT 
    EmployeeID, CurrentSalary, RaiseAmount, RaiseReason, 
    CurrentSalary + SUM(RaiseAmount) OVER (PARTITION BY EmployeeID, RaiseReason ORDER BY EmployeeID, RaiseReason) AS RunningSalaryTotal
FROM 
    Employees
如果我运行这个,我不会得到一个运行总数,相反,它会重置每次加薪的总和

例如:

EmployeeID   CurrentSalary   RaiseAmount   RaiseReason   RunningSalaryTotal
---------------------------------------------------------------------------
     1         100000          1000        Performance        101000
     1         100000          5000        Promotion          105000
EmployeeID   CurrentSalary   RaiseAmount   RaiseReason   RunningSalaryTotal
---------------------------------------------------------------------------
     1         100000          1000        Performance        106000
     1         100000          5000        Promotion          106000
第二条记录的持续工资总额应为100000+1000+5000=106000

如果我只按
EmployeeID
划分,则显示每个员工的最终总数

例如:

EmployeeID   CurrentSalary   RaiseAmount   RaiseReason   RunningSalaryTotal
---------------------------------------------------------------------------
     1         100000          1000        Performance        101000
     1         100000          5000        Promotion          105000
EmployeeID   CurrentSalary   RaiseAmount   RaiseReason   RunningSalaryTotal
---------------------------------------------------------------------------
     1         100000          1000        Performance        106000
     1         100000          5000        Promotion          106000
现在它只是一个总数,不是一个连续的总数


如何使
RunningSalaryTotal
为每个记录正确地递增?

只需按从分区中删除raisereason即可

SELECT EmployeeID, CurrentSalary, RaiseAmount, RaiseReason, CurrentSalary + SUM(RaiseAmount) OVER (PARTITION BY EmployeeID ORDER BY EmployeeID, RaiseReason) AS RunningSalaryTotal
FROM Employees
Sql fiddle

试试这个

SELECT EmployeeID, CurrentSalary, RaiseAmount, RaiseReason
    , CurrentSalary + SUM(RaiseAmount) OVER (PARTITION BY EmployeeID
                                                ORDER BY EmployeeID 
                                                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningSalaryTotal
FROM Employees

如果您不想在每次提升后“重置”,为什么在
分区依据
子句中有
RaiseReason
?此外,如果您提供数据,请将其作为DDL和DML语句或表格格式的
文本提供;样本数据和预期结果几乎不可能理解,并且从DBMS的角度来看是不可使用的。@Larnu正如我所说,我尝试了使用RaiseReason和不使用RaiseReason。两者都不正确。如果没有加薪原因,它不会为每个员工提供一个运行总数,只是一个总数。正如我所说的,如果我删除了加薪原因,那么我不会为每个员工提供一个运行总数,只是一个总数。不,请检查这里的t.ly/2nxpOSorry,它不起作用。我只是重复计算每个员工的总数,即使该员工多次加薪。每个员工都有他们当前的工资加上所有的加薪。我甚至已经重新运行了查询,但没有在分区中重新查找原因。您是否检查了sql FIDLE链接?因为默认情况下窗口是在无界的前一行和当前行之间的行,在这种情况下我们不需要明确提及,我不太熟悉它,不知道为什么,但是出于任何原因,有必要明确指定无界的前一行和当前行。一旦将其包括在内,运行总数就起作用了。可能是SQL Server配置问题?是否有某种标志可以改变默认行为?工作得很好!谢谢