首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server反向运行合计

SQL Server反向运行合计
EN

Stack Overflow用户
提问于 2016-05-06 03:30:20
回答 2查看 1.9K关注 0票数 4

我有一张桌子:

代码语言:javascript
复制
id  ID  Date    Cumulative
1   x   Jan-10  10
3   x   Feb-10  40
7   x   Apr-10  60
9   x   May-10  100
2   y   Jan-10  20
6   y   Mar-10  40
8   y   Apr-10  60
10  y   May-10  100

我需要将MS SQL Server中的"Cumulative“查询反向,如下所示

代码语言:javascript
复制
id  ID  Date    Cumulative  Reversed
1   x   Jan-10  10  10
3   x   Feb-10  40  30
7   x   Apr-10  60  20
9   x   May-10  100 40
2   y   Jan-10  20  20
6   y   Mar-10  40  20
8   y   Apr-10  60  20
10  y   May-10  100 40

注意:查询适用于SQL Server 2012

EN

回答 2

Stack Overflow用户

发布于 2016-05-06 03:32:09

您可以使用lag获取前一行中的值,然后从当前行的值中减去该值以获得反转的值。

代码语言:javascript
复制
select t.*, cumulative - coalesce(lag(cumulative) over(partition by id order by date),0) as reversed
from tablename t

来自@戈登·林诺夫的评论。您可以使用lag(cumulative,1,0)而不是coalesce

代码语言:javascript
复制
select t.*, cumulative-lag(cumulative,1,0) over(partition by id order by date) as reversed
from tablename t
票数 9
EN

Stack Overflow用户

发布于 2016-05-06 17:03:05

对于以下使用递归CTE的Sql server 2012

代码语言:javascript
复制
declare @t table(id int,IDs varchar(20),Dates varchar(20),Cumulative int)
insert into @t values
(1,'x','Jan-10',  10)
,(3,'x','Feb-10',  40)
,(7,'x','Apr-10',  60)
,(9,'x','May-10', 100)
,(2,'y','Jan-10',  20)
,(6,'y','Mar-10',  40)
,(8,'y','Apr-10',  60)
,(10,'y','May-10',100)

;With CTE as
(select *,row_number()over(partition by ids order by id)rn 
from @t
)
,CTE1 as
(select id,ids,dates, Cumulative,rn,Cumulative Reversed 
from cte where rn=1
union all
select c.id,c.ids,c.Dates,c.Cumulative,c.rn 
,c.Cumulative-c1.Cumulative
from cte c
inner join cte c1 on c.ids=c1.ids
where c.rn=c1.rn+1
)
select * from cte1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37058818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档