有一张表,需要减去前一列和当前金额。表值如下,需要为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语法减去列的当前值和先前值
答案 0 :(得分:3)
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;