Table & DDL:
|id |gooditem|amt |
|---|--------|-----|
|1 |apple |1000 |
|2 |apple |2000 |
|3 |apple |-3000|
|4 |apple |500 |
|5 |apple |1500 |
|6 |pen |1000 |
|7 |pen |2000 |
|8 |pen |-3000|
|9 |pen |500 |
|10 |pen |2500 |
CREATE TABLE T
([id] int, [gooditem] varchar(5), [amt] int)
;
INSERT INTO T
([id], [gooditem], [amt])
VALUES
(1, 'apple', 1000),
(2, 'apple', 2000),
(3, 'apple', -3000),
(4, 'apple', 500),
(5, 'apple', 1500),
(6, 'pen', 1000),
(7, 'pen', 2000),
(8, 'pen', -3000),
(9, 'pen', 500),
(10, 'pen', 2500)
;
Test Demo Link
Logic
- Общее количество продукта составляет 2000, ручка 3000
- Сумма суммы в обратном порядке по ID
ожидаемый результат
|id |gooditem|amt |formula |total_amt|
|---|--------|-----|-----------------------------|---------|
|1 |foo |1000 |2000-1500-500--3000-2000-1000|0 |
|2 |foo |2000 |2000-1500-500--3000-2000 |1000 |
|3 |foo |-3000|2000-1500-500--3000 |3000 |
|4 |foo |500 |2000-1500-500 |0 |
|5 |foo |1500 |2000-1500 |500 |
|6 |pen |1000 |3000-1500-500--3000-2000-1000|0 |
|7 |pen |2000 |3000-1500-500--3000-2000 |1000 |
|8 |pen |-3000|3000-1500-500--3000 |2000 |
|9 |pen |500 |3000-1500-500 |1000 |
|10 |pen |1500 |3000-1500 |1500 |
Моя попытка и проблема
I 'мы пытались использовать rownumber()
для заказа идентификатора, а затем использовать данные суммы идентификаторов.но у меня есть проблема в группе по gooditem to get total value and sum the value in reverse order by somecolumn
Версия
Microsoft SQL Server 2008 R2 (окончательная первоначальная версия) - 10.50.1600.1 (X64)
Мой ответ для sql server 2008
with cte as (
select row_number() over (partition by [gooditem] order by id desc) rnk
,sum(T1.amt) over (partition by T1.gooditem) total_amt,*
from T T1
)
,cte2 as (
select T1.gooditem ,T1.id,T1.rnk,T1.amt ,T1.total_amt -T1.amt as total_amt from cte T1
where T1.rnk = 1
union all
select T1.gooditem ,T1.id,T1.rnk,T1.amt ,T2.total_amt - T1.amt as total_amt from cte T1
inner join cte2 T2 on T1.[gooditem] = T2.[gooditem] and T1.rnk = T2.rnk+1
)
select T1.id,T1.gooditem,T1.amt ,T1.total_amt
from cte2 T1
order by id
db <> fiddle