SQL 服务器 - 添加或减去先前的值
SQL Server - Add or Subtract from Previous Value
我正在尝试从这些数据中取得平衡
Date Logged Closed
-------------- ----------- -----------
1-Jan-2016 0 0
2-Jan-2016 8 7
3-Jan-2016 8 8
4-Jan-2016 25 11
5-Jan-2016 20 16
6-Jan-2016 14 13
7-Jan-2016 10 12
8-Jan-2016 9 7
9-Jan-2016 12 12
10-Jan-2016 3 4
预期输出是
Date Logged Closed Balance
-------------- ----------- ----------- ----------
1-Jan-2016 0 0 0
2-Jan-2016 8 7 1
3-Jan-2016 8 8 1
4-Jan-2016 25 11 15
5-Jan-2016 20 16 19
6-Jan-2016 14 13 20
7-Jan-2016 10 12 18
8-Jan-2016 9 7 20
9-Jan-2016 12 12 20
10-Jan-2016 3 4 27
公式为 BALANCE =
上一个余额 + 已记录 - 已关闭。
示例公式:
Jan 5 Balance (15) = 1(prevBalance) + 25(currentLogged) - 11(currentClosed)
我试过这个公式,但没有得到接近预期的结果。
WITH CTE AS (
SELECT
rownum = ROW_NUMBER() OVER (ORDER BY Date),
Date, Logged, Closed
FROM Table
)
SELECT
(prev.Logged - prev.Closed)+ (a.Logged-a.Closed) as [Balance]
FROM CTE
LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1
使用的其他参考资料
SQL Server - Calculate current row value using previous row value
您可以使用 Window 函数 sum
。
试试这个:
select
t.*,
sum(logged - closed) over (order by date) balance
from your_table t;
你回答的问题是你计算的时候没有上一行的Balanced(SQL-Server的All-at-once原则)。您的问题有一个隐藏的要求,即计算所有先前行的总和,按日期排序。
试试这个(仅适用于 SQL Server 2012 及更高版本)
SELECT
[Date], Logged, Closed,
SUM(Logged) OVER (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
- SUM (Closed) OVER (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Balance
FROM
<<Table>>
之前的版本:
SELECT
t.[Date], t.Logged, t.Closed, sub.L - sub.C AS Balanced
FROM
<<Table>> t
CROSS APPLY ( SELECT SUM(Logged) AS L, SUM(Closed) AS c FROM <<Table>> WHERE [Date] <= t.[Date]) AS sub
我正在尝试从这些数据中取得平衡
Date Logged Closed
-------------- ----------- -----------
1-Jan-2016 0 0
2-Jan-2016 8 7
3-Jan-2016 8 8
4-Jan-2016 25 11
5-Jan-2016 20 16
6-Jan-2016 14 13
7-Jan-2016 10 12
8-Jan-2016 9 7
9-Jan-2016 12 12
10-Jan-2016 3 4
预期输出是
Date Logged Closed Balance
-------------- ----------- ----------- ----------
1-Jan-2016 0 0 0
2-Jan-2016 8 7 1
3-Jan-2016 8 8 1
4-Jan-2016 25 11 15
5-Jan-2016 20 16 19
6-Jan-2016 14 13 20
7-Jan-2016 10 12 18
8-Jan-2016 9 7 20
9-Jan-2016 12 12 20
10-Jan-2016 3 4 27
公式为 BALANCE = 上一个余额 + 已记录 - 已关闭。
示例公式:
Jan 5 Balance (15) = 1(prevBalance) + 25(currentLogged) - 11(currentClosed)
我试过这个公式,但没有得到接近预期的结果。
WITH CTE AS (
SELECT
rownum = ROW_NUMBER() OVER (ORDER BY Date),
Date, Logged, Closed
FROM Table
)
SELECT
(prev.Logged - prev.Closed)+ (a.Logged-a.Closed) as [Balance]
FROM CTE
LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1
使用的其他参考资料
SQL Server - Calculate current row value using previous row value
您可以使用 Window 函数 sum
。
试试这个:
select
t.*,
sum(logged - closed) over (order by date) balance
from your_table t;
你回答的问题是你计算的时候没有上一行的Balanced(SQL-Server的All-at-once原则)。您的问题有一个隐藏的要求,即计算所有先前行的总和,按日期排序。
试试这个(仅适用于 SQL Server 2012 及更高版本)
SELECT
[Date], Logged, Closed,
SUM(Logged) OVER (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
- SUM (Closed) OVER (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Balance
FROM
<<Table>>
之前的版本:
SELECT
t.[Date], t.Logged, t.Closed, sub.L - sub.C AS Balanced
FROM
<<Table>> t
CROSS APPLY ( SELECT SUM(Logged) AS L, SUM(Closed) AS c FROM <<Table>> WHERE [Date] <= t.[Date]) AS sub