以前计算的SQL Server求和字段

时间:2017-12-09 12:47:47

标签: sql sql-server stored-procedures

在SQL Server中,我有4列的表

 artid    num     A           B
   46     1     417636000     0 
   47     1     15024000      0
  102     1     3418105650    0
  226     1     1160601286    0
  60     668    260000        0
  69     668    5500000       0

我想在结果集中为某些计算创建新列

此列应具有如下值:

artid       num         a                      b                      newColumnValue
----------- ----------- ---------------------- ---------------------- ----------------------
46          1           417636000              0                      a-b+previous newColumnValue

我写了这个查询,但我无法获得previous newColumnValue

select *, (a- b+ lag(a- b, 1, a- b) over (order by num,artid)) as newColumnValue
 FROM MainTbl
  ORDER BY  num,artid

我得到了这个结果

artid       num         a                      b                      newColumnValue
----------- ----------- ---------------------- ---------------------- ----------------------
46          1           417636000              0                      417636000
47          1           15024000               0                      432660000
102         1           3418105650             0                      3433129650
226         1           1160601286             0                      4578706936
60          668         260000                 0                      1160861286
69          668         5500000                0                      5760000

我想得到这个结果

artid       num         a                      b                      newColumnValue
----------- ----------- ---------------------- ---------------------- ----------------------
46          1           417636000              0                      417636000
47          1           15024000               0                      432660000
102         1           3418105650             0                      3850765650
226         1           1160601286             0                      5011366936
60          668         260000                 0                      5011626936
69          668         5500000                0                      5017126936

2 个答案:

答案 0 :(得分:0)

鉴于以下示例数据,

+----+---+---+
| Id | A | B |
+----+---+---+
| 1  | 2 | 3 |
+----+---+---+
| 2  | 3 | 4 |
+----+---+---+
| 3  | 4 | 5 |
+----+---+---+
| 4  | 5 | 6 |
+----+---+---+
| 5  | 6 | 7 |
+----+---+---+

以下短SQL语句产生所需的输出:

select A - B + lag(A - B, 1, 0) over (order by id)
from test

+----+
| -1 |
+----+
| -2 |
+----+
| -2 |
+----+
| -2 |
+----+
| -2 |
+----+

请注意,Lag function有三个参数:第一个是您要为"滞后"评估的表达式。记录,第二个是滞后量(默认为1),第三个是无法计算表达式时返回的值(例如,如果它是第一个记录)。

答案 1 :(得分:0)

你想要累积总和(好吧,它们之间的差异):

select a, b, sum(a - b) over (order by num, artid)
from mytbl;

注意:SQL表代表无序集。您需要一列来指定定义上一个的顺序。如果您真的只有两列,那么我可能会认为排序基于a,查询将是:

select a, b, sum(a - b) over (order by a)
from mytbl;