游标以某种方式更新值

时间:2014-02-19 19:41:36

标签: sql-server

在SQL Server 2008 R2中,我有一个这样的表:

ID  Dates      Count
1   03-02-2014  2
2   04-02-2014  1
3   05-02-2014  NULL
4   06-02-2014  1
5   07-02-2014  3
6   08-02-2014  NULL
7   09-02-2014  2
8   10-02-2014  NULL
9   11-02-2014  1
10  12-02-2014  3
11  13-02-2014  NULL
12  14-02-2014  1

我有一个INT变量,有一些值,比如@XCount = 15。

我的要求是用(@XCount - Count)更新计数列,例如先前记录的结果将被下一记录中的Count值减去。

结果:

ID  Dates        Count  
1   03-02-2014  13  (15-2)
2   04-02-2014  12  (13-1)
3   05-02-2014  12  (12-0)
4   06-02-2014  11  (12-1)
5   07-02-2014  8   (11-3)
6   08-02-2014  8   (8-0)
7   09-02-2014  6   (8-2)
8   10-02-2014  6   (6-0)
9   11-02-2014  5   (6-1)
10  12-02-2014  2   (5-3)
11  13-02-2014  2   (2-0)
12  14-02-2014  1   (2-1)

我不愿意使用游标作为解决方案。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

这样的东西
DECLARE @XCount INT = 15

;WITH Vals AS(
  SELECT ID, Dates, [Count] OriginalCount, @XCount - ISNULL([COUNT],0) NewCount
  FROM Table1
  WHERE ID = 1  
  UNION ALL
  SELECT t.ID, t.Dates, t.[Count], v.NewCount - ISNULL(t.[Count],0)
  FROM Table1 t INNER JOIN Vals v ON t.ID = v.ID + 1
)
SELECT *
FROM Vals

SQL Fiddle DEMO

请注意这是一个递归查询,有时(直到技术允许它,例如SQL SERVER 2012 LAGRunning totals)旧的确实有效。