我試圖弄清楚如何撰寫一個回圈來計算具有舊價格的單個物品庫存的剩余部分......
例如
我有一個查詢
Select Document_Date, Quantity, Price FROM ArticlesTrafic
Where ArticleID = '605467'
and DocumentTypeID = 'PRE'
and DocumentDate > '01-01-2020'
輸出
Document_Date Quantity Price
2021-09-28 00:00:00.000 2 68,955405
2021-09-28 00:00:00.000 8 68,945184
2021-10-18 00:00:00.000 166 70,881881
2022-07-20 00:00:00.000 250 83,753749
2022-08-16 00:00:00.000 350 83,300471
2022-09-09 00:00:00.000 200 70
和另一個查詢,我可以在其中提取當前股票
Select stock from
current_stock(1,GETDATE())
where ArticleID = '605467'
輸出
庫存 770
我想知道的是,現在可用的 770 件中有多少商品是最舊的價格。
如果我們回到第一張表,我們可以看到以 70 的價格購買了 200 件,然后以 83,3 的價格購買了 350 件……等等
結果顯示當前可用的 770 中有 220 件,以 83,75 的價格購買
結果樣本
stock remaining_stock oldest_price
770 220 83,753
這是Excel中的相同薄

它顯示在當前庫存 792 中剩余 16 件以最舊價格出售的商品
我修改了 Charlieface 發布的解決方案
SELECT Q.ArticleID, Q.Stock, Q.Remaining, Q.ProvisionUnit FROM
(SELECT
at.*, cs.Stock,
Remaining = cs.Stock - (at.RunningSum - at.TraficQuantityCredit),
ROW_NUMBER() OVER (PARTITION BY at.ArticleID ORDER BY at.DocumentDate ASC) AS ID
FROM (
SELECT
at.ArticleID,
at.DocumentDate,
at.TraficQuantityCredit,
at.ProvisionUnit,
RunningSum = SUM(at.TraficQuantityCredit) OVER
(PARTITION BY at.ArticleID ORDER BY at.DocumentDate DESC
ROWS UNBOUNDED PRECEDING)
FROM ArticlesTrafic at
WHERE at.ArticleID IN ('605466', '605467')
AND at.DocumentTypeID = 'PRE'
AND at.DocumentDate > '01-01-2020'
) at
JOIN dbo.fnArticleStockPerDayTable(1, GETDATE()) cs ON cs.ArticleID = at.ArticleID
WHERE cs.Stock > at.RunningSum - at.TraficQuantityCredit
AND cs.Stock <= at.RunningSum) AS Q
WHERE Q.ID = 1
輸出
ArticleID Stock Remaining ProvisionUnit
605466 194 54 83,828542
605467 750 200 83,753749
資料是正確的,唯一的問題是它在更大的文章串列中非常慢,將繼續使用它并進行優化。
再次感謝 !
uj5u.com熱心網友回復:
您不需要回圈,您可以使用視窗函式。SQL 中很少需要回圈,如果你發現自己在寫 onoe,你應該質疑它。
您需要計算ArticlesTrafic.Quantity向后作業的運行總和,然后取行,這是您超過總數的點Stock
SELECT
at.*,
Remaining = cs.Stock - (at.RunningSum - at.Quantity)
FROM (
SELECT
at.Document_Date,
at.Quantity,
at.Price,
RunningSum = SUM(at.Quantity) OVER
(PARTITION BY at.ArticleID ORDER BY at.DocumentDate DESC
ROWS UNBOUNDED PRECEDING)
FROM ArticlesTrafic at
WHERE at.ArticleID = '605467'
AND at.DocumentTypeID = 'PRE'
AND at.DocumentDate > '01-01-2020'
) at
JOIN current_stock(1, GETDATE()) cs ON cs.ArticleID = at.ArticleID
WHERE cs.Stock > at.RunningSum - at.Quantity
AND cs.Stock <= at.RunningSum;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/507046.html
上一篇:SQL-最大運行總計
