You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL计算销货成本(COGS)问题:FIFO匹配结果数量不符

基于FIFO逻辑计算销货成本(COGS)的SQL问题

需求:基于先进先出(FIFO)逻辑计算销货成本(COGS),现有两个数据表:

  • PurchaseActions:包含字段 PurchaseId、PurchaseDate、PurchaseLineId、ItemId、Quantity、Price
  • SaleActions:包含字段 SaleId、SaleDate、SaleLineId、ItemId、Quantity、Price

示例数据

8月1日:以1美元单价采购60件X商品
8月2日:以2美元单价采购5件X商品
8月5日:以1.5美元单价售出63件X商品

问题

预期结果应匹配60件(来自8月1日采购)和3件(来自8月2日采购),但编写的SQL查询返回的是60件和5件。

现有SQL代码

WITH RankedPurchases AS (SELECT PurchaseId,
                                PurchaseDate,
                                LineId                                                                                AS PurchaseLineId,
                                ItemId,
                                Quantity,
                                Price,
                                SUM(Quantity) OVER (PARTITION BY ItemId ORDER BY PurchaseDate, PurchaseId)            AS CumulativePurchaseQuantity,
                                SUM(Quantity) OVER (PARTITION BY ItemId ORDER BY PurchaseDate, PurchaseId) - Quantity AS PreviousCumulativePurchaseQuantity
                         FROM @PurchaseActions),
     RankedSales AS (SELECT SaleId,
                            SaleDate,
                            LineId                                                                        AS SaleLineId,
                            ItemId,
                            Quantity,
                            SUM(Quantity) OVER (PARTITION BY ItemId ORDER BY SaleDate, SaleId)            AS CumulativeSaleQuantity,
                            SUM(Quantity) OVER (PARTITION BY ItemId ORDER BY SaleDate, SaleId) - Quantity AS PreviousCumulativeSaleQuantity
                     FROM @SaleActions),
     MatchedSales AS (SELECT s.SaleId,
                             s.SaleLineId,
                             p.PurchaseId,
                             p.PurchaseLineId,
                             s.ItemId,
                             s.Quantity                                                                                    AS SaleQuantity,
                             p.Quantity                                                                                    AS PurchaseQuantity,
                             p.Price,
                             s.PreviousCumulativeSaleQuantity,
                             p.PreviousCumulativePurchaseQuantity,
                             ROW_NUMBER() OVER (PARTITION BY s.SaleId, s.SaleLineId ORDER BY p.PurchaseDate, p.PurchaseId) AS RowNum
                      FROM RankedSales s
                               JOIN RankedPurchases p ON s.ItemId = p.ItemId
                      WHERE p.CumulativePurchaseQuantity > s.PreviousCumulativeSaleQuantity
                        AND p.PreviousCumulativePurchaseQuantity < s.CumulativeSaleQuantity)
SELECT SaleId,
       SaleLineId,
       PurchaseId,
       PurchaseLineId,
       CASE
           WHEN RowNum = 1 THEN
               CASE
                   WHEN SaleQuantity <= PurchaseQuantity THEN SaleQuantity
                   ELSE PurchaseQuantity
                   END
           ELSE
               CASE
                   WHEN SaleQuantity - (PreviousCumulativeSaleQuantity - PreviousCumulativePurchaseQuantity) <= PurchaseQuantity
                       THEN SaleQuantity - (PreviousCumulativeSaleQuantity - PreviousCumulativePurchaseQuantity)
                   ELSE PurchaseQuantity
                   END
           END AS Quantity,
       Price
FROM MatchedSales
ORDER BY ItemId, SaleId, SaleLineId, RowNum

内容的提问来源于stack exchange,提问作者Kanan Mammadov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:42:36