Pomniejszanie wartości w odpowiednich rekordach, dopóki nie wyczerpie się wartość zadana

0

Temat chyba nie bardzo mówi co chce osiągnąć.
Otóż chodzi o to że baze w SQL Server, a w niej mam w tabele:

item_id | item_name | user_id | amount | date

Dodaję do tej tabeli rekordy. Mam powiedzmy coś takiego:

11 | "Item1" | 265 | 10 | 2017-01-01
11 | "Item1" | 265 | 5 | 2017-01-01
11 | "Item1" | 265 | 20 | 2017-03-02
12 | "Item3" | 12| 1| 2017-03-05
.
.
.

W niektórych sytuacjach muszę zrobć coś takiego, dostaję informację item_id | user_id | amount
teraz muszę pomniejszyć ilosci dla tego usera i item, ale pomniejszać muszę od najstarszego rekordu. Czyli np dla usera 265, itema 11 i ilosci 12 muszę zrobić update ilości 10=>0, a w drugim rekordzie update 5=>3
Mógłby mi ktoś podpowiedzieć jak takie coś zrobić?

0

nie zrobisz tego jednym zapytaniem. Najprościej napisać stored proc, która pobierze wszystkie rekordy dla danego itema i usera i w pętli pomniejszać aż do żądanej ilości

0

Spróbuję tak jak mowisz chociaz wydaje mi sie ze to troche trudne zagadnienie.

0

pierwszy link z googla jak w procedurze iterować po pobranych z bazy rekordach.
https://stackoverflow.com/questions/2622230/how-can-i-iterate-over-a-recordset-within-a-stored-procedure
Pozostaje Ci napisać update

0

A tam od razu kursor, wystarczy jeden update:

declare @i integer
set @i = 12

;with cteD as (
select 
	*
	,case when rs-amount-@i <= 0 then 
			case when amount +  (rs-amount-@i) < 0 then
				0
			else
				amount +  (rs-amount-@i) 
			end
		else 
			amount 
		end new_amount
from (select 
		*
		,sum(amount) over (partition by item_id order by [date] ROWS UNBOUNDED PRECEDING) rs
	from 
		t) dt
where 
	item_id = 11)
    
select * from cteD    
order by 
	item_id, date

http://sqlfiddle.com/#!6/232281/2

Dla wersji >=2012 sql server

Wtedy aktualizacje danych mozesz zrobić joinując się z widokiem cteD

1 użytkowników online, w tym zalogowanych: 0, gości: 1