Forum
Merhabalar,
Mevcut ERP Programımdan Stok fiyat listem var, aşağıdaki gibi veri çekiyorum.
SET DATEFORMAT DMY;
DECLARE @BASTAR DATETIME set @BASTAR='01.01.2020';
DECLARE @BITTAR DATETIME set @BITTAR='31.12.2021';
SELECT STOKKODU,(SELECT STOK_ADI FROM TBLSTSABIT WHERE STOK_KODU = STOKKODU)STOK_ADI
,BASTAR[Fiyat Tarihi]
,CASE WHEN A_S = 'A' THEN 'Alış' WHEN A_S = 'S' THEN 'Satış' END AS [Alış/Satış]
,isnull(CASE WHEN A_S = 'A' THEN FIYAT1 END,0) AS [Alışfiyat]
,FIYAT1
FROM TBLSTOKFIAT WHERE
STOKKODU ='5449000016645'
AND BASTAR BETWEEN @BASTAR AND @BITTAR
-------------------------------
Stok Kodu Fiyat Tarihi Al/Sat Alış Fiyat Satış Fiyat
5449000016645 2020-01-01 Satis 0.00 5.90
5449000016645 2020-01-27 Alis 6.74 6.74
5449000016645 2020-03-06 Satis 0.00 6.75
5449000016645 2020-04-07 Satis 0.00 6.75
5449000016645 2020-08-08 Satis 0.00 5.90
5449000016645 2020-09-10 Alis 8.00 8.00
5449000016645 2020-10-11 Satis 0.00 9.25
5449000016645 2020-11-12 Satis 0.00 9.25
----------------------------------------------
Bu sorguya göre hangi tarihlerde kar, hangi tarihlerde zarar etmişim? hemen yanına oranları ile yazabilirmiyim.
Şimdiden Teşekkürler.
(Yani Satış fiyatı verilen tarihten önceki en büyük tarihteki alış fiyatını [Alış Fiyat] alanına yazmak yeterli olur sanırım.)
Aşağıdaki gibi;
Stok Kodu Fiyat Tarihi Al/Sat Alış Fiyat Satış Fiyat
5449000016645 2020-01-01 Satis 0.00 5.90
5449000016645 2020-01-27 Alis 6.74 6.75
5449000016645 2020-03-06 Satis 6,74 6.75
5449000016645 2020-04-07 Satis 6,74 6.75
5449000016645 2020-08-08 Satis 6,74 5.90
5449000016645 2020-09-10 Alis 8.00 5,90
5449000016645 2020-09-10 Satis 8.00 9.25
5449000016645 2020-11-12 Satis 8.00 9.25
Merhaba,
İstediğin yapıya uygun elimde data olmadığı için şöyle bir örnek yaptım
---TABLO OLUŞTURMA
--CREATE table TBLSTOKFIAT (ID INT IDENTITY (1,1),STOKKODU VARCHAR(100),MIKTAR INT,BASTAR datetime,ALSAT varchar(10),FIYAT INT)
--TABLONUN İÇİNE 1000 SATIR RASTGELE VERİ GİRME
TRUNCATE TABLE TBLSTOKFIAT
DECLARE @STOKKODU AS VARCHAR(100)='5449000016645'
DECLARE @ALISFIYAT AS INT=100
DECLARE @SATISFIYAT AS INT=120
DECLARE @FIYAT AS INT
DECLARE @I AS INT=1
WHILE @I<100
BEGIN
DECLARE @RAND AS FLOAT
SET @RAND =RAND()
DECLARE @MIKTAR AS INT
DECLARE @ALSAT AS VARCHAR
DECLARE @TARIH AS DATE
IF @RAND>=0.5
BEGIN
SET @ALSAT ='S'
SET @FIYAT =RAND()*20+(@SATISFIYAT-10)
SET @TARIH =DATEADD(DAY,RAND()*365,'20200101')
INSERT INTO TBLSTOKFIAT (STOKKODU,BASTAR,ALSAT,FIYAT,MIKTAR)
VALUES (@STOKKODU,@TARIH,@ALSAT,@FIYAT,RAND()*10)
END
ELSE
BEGIN
SET @ALSAT ='A'
SET @FIYAT =RAND()*20+(@ALISFIYAT-10)
SET @TARIH =DATEADD(DAY,RAND()*365,'20200101')
INSERT INTO TBLSTOKFIAT (STOKKODU,BASTAR,ALSAT,FIYAT,MIKTAR)
VALUES (@STOKKODU,@TARIH,@ALSAT,@FIYAT,RAND()*10)
END
SET @I=@I+1
END
--MALİYET, SATIŞ FİYATI, SON ALIŞ FİYATI VE KAR HESAPLAMA
SELECT *,FIYAT-SONALISFIYATI AS KAR,ROUND((FIYAT-SONALISFIYATI)/CONVERT(FLOAT,SONALISFIYATI)*100,2) AS KAR_YUZDE FROM
(
SELECT STOKKODU,BASTAR,ALSAT,FIYAT,
(SELECT TOP 1 FIYAT FROM TBLSTOKFIAT WHERE STOKKODU=SF.STOKKODU AND BASTAR<=SF.BASTAR AND ALSAT='A' ORDER BY BASTAR DESC) AS SONALISFIYATI
FROM TBLSTOKFIAT SF WHERE ALSAT='S'
) T
ORDER BY BASTAR
Bu da sonuç.