Je souhaite effectuer un calcul via la méthode LIFO (dernier entré, premier sorti) avec TSQL.Calculer les résultats avec la méthode LIFO via TSQL
L'utilisation de la méthode LIFO vous obligera à calculer le bénéfice/la perte en vendant les dernières transactions.
Exemple comment cela fonctionne:
- affaire est conclue le 1er mars, nous achetons 10 actions pour 5 dollars chaque
- affaire est conclue le 2 mars, nous achetons 15 stocks pour 6 dollars chaque
- deal est conclu le 3 mars, nous achetons 5 actions pour 4 dollars chaque
- affaire est conclue le 4 mars, nous avons 17 SELL stocks pour 7 dollars chaque
Par la 4ème transaction nous avons maintenant vendu 5 actions du 3 mars pour 4 dollars chacune et 12 actions du 2 mars 6 dollars chacune.
Donc maintenant nous avons quitté ce qui suit: 10 stocks pour 5 dollars chacun de transaction le 1 mars 3 stocks de 6 dollars chacun de la transaction le 2 mars (17-5-15 = -3).
13 stocks ayant quitté avec un prix moyen de (10 * 5 + 3 * 6)/13 = 5,23076923
Voici les scripts de génération de données de test:
use TestTask
go
IF OBJECT_ID('testtable','U')IS NOT NULL
DROP TABLE testtable
go
create table testtable
(
stockid int not null,
dealid int identity (1,1) not null,
dealtype char(1) not null,
stockdate datetime not null,
stockamount int not null,
priceperstock int not null
)
insert into testtable(stockid,dealtype,stockdate,stockamount,priceperstock)
VALUES
(111,'B','01.03.2016',10,5),
(111,'B','02.03.2016',15,6),
(111,'B','03.03.2016',5,4),
(111,'S','04.03.2016',17,7)
Je voudrais calculer la position financière et beaucoup d'autres paramètres qui me requerraient pour savoir combien de stocks avec le prix approprié est parti. Je suis venu à cette jusqu'à présent:
select
stockid,
dealid,
dealtype,
stockdate,
priceperstock,
case dealtype
when 'B' then stockamount
when 'S' then -stockamount
end as stockamount,
sum(
case dealtype
when 'B' then stockamount
when 'S' then -stockamount
end
) over (partition by
stockid order by dealid ROWS UNBOUNDED PRECEDING)
as poistion
from testtable
Sortie:
stockid dealid dealtype stockdate priceperstock stockamount poistion
111 1 B 2016-01-03 00:00:00.000 5 10 10
111 2 B 2016-02-03 00:00:00.000 6 15 25
111 3 B 2016-03-03 00:00:00.000 4 5 30
111 4 S 2016-04-03 00:00:00.000 7 -17 13
sortie souhaitée:
stockid dealid dealtype stockdate priceperstock stockamount poistion stocksleft
111 1 B 2016-01-03 00:00:00.000 5 10 10 10
111 2 B 2016-02-03 00:00:00.000 6 15 25 3
111 3 B 2016-03-03 00:00:00.000 4 5 30 0
111 4 S 2016-04-03 00:00:00.000 7 -17 13 0
Quelle est la meilleure façon d'aller?