2016-05-05 6 views
4

У меня есть эта таблица:SQL Server Reverse Running Total

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 Query, чтобы быть следующим

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

+0

Что 'Reverse "совокупного"' означает? – Siyual

+0

Противоположность текущей сумме, вместо того, чтобы иметь ее в качестве обрезания, будет вычитать значение из предыдущей записи –

+0

Google Lag/Lead – dfundako

ответ

7

Вы можете использовать lag, чтобы получить значение в предыдущей строке и вычесть из значения текущей строки, чтобы получить обратное значение.

select t.*, cumulative - coalesce(lag(cumulative) over(partition by id order by date),0) as reversed 
from tablename t 

Из комментария @Gordon Linoff в .. Вы можете использовать lag(cumulative,1,0) вместо coalesce.

select t.*, cumulative-lag(cumulative,1,0) over(partition by id order by date) as reversed 
from tablename t 
+0

запрос дал тот же результат, что и столбец «Кумулятивный» без изменений –

+1

он имеет отношение к 2 столбцам, id' в вашем примере таблицы. вы должны соответствующим образом изменить его. Если ваш столбец 'date' является' varchar', вы должны рассмотреть возможность изменения 'order by' соответственно или использовать другой столбец для заказа. –

+0

Теперь он работает, я конвертирую столбцы Date из Nvarchar в Datetime. Благодарю . –

1

Для ниже SQL Server 2012 с использованием рекурсивного ОТВ

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