我查看了一些运行总示例的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
答案 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
,以便在有多个行具有相同日期的情况下使结果保持稳定。