如何减去SQL Server中的当前值和先前值

时间:2018-06-22 13:32:43

标签: sql sql-server tsql

有一张表,需要减去前一列和当前金额。表值如下,需要为Cal-Amount列写语法

Id Amount Cal-Amount
 1  100   0
 2  200   0
 3  400   0
 4  500   0

Cal-Amount带有样本值的计算公式

Id Amount Cal-Amount
 1  100   (0-100)=100
 2  200   (100-200)=100
 3  400   (200-400)=200
 4  500   (400-500)=100

需要使用SQL语法减去列的当前值和先前值

5 个答案:

答案 0 :(得分:3)

如果您使用的是SQL Server 2012或更高版本,则

LAG是一种选择:

SELECT
    Id,
    Amount,
    LAG(Amount, 1, 0) OVER (ORDER BY Id) - Amount AS [Cal-Amount]
FROM yourTable;

如果您使用的是SQL Server的早期版本,那么我们可以使用自我联接:

SELECT
    Id,
    Amount,
    COALESCE(t2.Amount, 0) - t1.Amount AS [Cal-Amount]
FROM yourTable t1
LEFT JOIN yourTable t2
    ON t1.Id = t2.Id + 1;

但是请注意,仅当Id值连续时,自连接选项才可能起作用。 LAG可能是执行此操作最有效的方法,并且只要顺序正确,它对于非连续Id值也很健壮。

答案 1 :(得分:2)

好吧,蒂姆击败我了lag(),所以这是使用join的老派:

select t.Id,t.Amount,t.Amount-isnull(t2.Amount,0) AS [Cal-Amount]
from yourtable t
left join yourtable t2 on t.id=t2.id+1

答案 2 :(得分:2)

SQL Server 2012或更高版本:

Select 
    ID, Amount, [Cal-Amount] = Amount - LAG(Amount, 1, 0) OVER (ORDER BY Id)
From 
    table

Select 
    current.ID, Current.Amount, Current.Amount - Isnull(Prior.Amount, 0)
from 
    table current 
left join 
    table prior on current.id - 1 = prior.id

答案 3 :(得分:1)

如果您的SQL Server> = 2012,则可以使用LAG功能

declare @t table (id int, amount1 int)

insert into @t
values (1, 100), (2, 200), (3, 400), (4, 500)

select
    *, amount1 - LAG(amount1, 1, 0) over (order by id) as CalAmount 
from 
    @t

答案 4 :(得分:0)

您也可以使用apply

select t.*, t.Amount - coalesce(tt.Amount, 0) as CalAmount
from table t outer apply (
     select top (1) *
     from table t1
     where t1.id < t.id
     order by t1.id desc
) tt;