运行总和减去不同的条件

时间:2017-06-22 08:37:56

标签: sql sql-server

我查看了一些运行总示例的SQL Server,但我无法管理这样的事情。

我有一个表,其中我有列id,名称,操作类型,日期,值。 我想计算每条记录的余额。余额应按如下方式计算:

起始余额必须为0,然后如果操作类型为IN则会有加号,如果操作为OUT则会有减号。每个下一个记录应该看到先前的记录余额,然后是+值或 - 值,具体取决于操作类型。

此操作应按日期排序(不是Id)。

例如,如果表格如下所示:

ID Name  Op_Type Date       Value
1  box   Out     2017-05-13 15
2  table In      2017-04-31 65
3  box2  In      2017-05-31 65

然后结果应该是这样的

ID Name  Op_Type Date       Value Balance
2  table In      2017-04-31 65     65
1  box   Out     2017-05-13 15     50
3  box2  In      2017-05-31 65     115

此代码的结果:

select *,
       sum(case when Op_Type = 'Out' then -Value else Value end)Over(Order by [Date]) as Balance
From Yourtable

是:

ID  Date        Type        Value       Balance
143 2016-12-31  In          980         664.75
89  2016-12-31  Out         300         664.75
90  2016-12-31  Out         80          664.75

但我希望得到以下结果:

ID  Date        Type        Value       Balance
143 2016-12-31  In          980         980
89  2016-12-31  Out         300         680
90  2016-12-31  Out         80          600

1 个答案:

答案 0 :(得分:1)

Prdp回答的问题是SUM(...) OVER (ORDER BY ...)默认使用RANGE选项而不是ROW

这就是当日期不唯一时您会看到意外结果的原因。这是默认RANGE选项的工作方式。

要获得您期望的结果,请明确拼写:

SELECT
    *
    ,SUM(CASE WHEN Op_Type = 'Out' 
        THEN -Value ELSE Value END)
    OVER(ORDER BY [Date], Op_Type, ID
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Balance
FROM YourTable
ORDER BY [Date], Op_Type, ID;

我还在Op_Type中添加了ORDER BY,以便在有多个行具有相同日期的情况下首先添加正值。

我在ID中添加了ORDER BY,以便在有多个行具有相同日期的情况下使结果保持稳定。

相关问题