Oracle SQL 查询分配数量

Oracle SQL Query for Distributing Quantity

我有一个 table 名为 INVENTORY 的数据:

ITEM_NUM SUB_INV LOT_NUM QUANTITY LOT_EXPIRY_DATE
101      22      A1      10       9/29/2019 
101      22      A2      14       9/28/2019 

比方说,我有一个请求从这些批次中提取 20 个数量。根据 table,我的可用总数量为 24 (10 + 14)。所以我有足够的数量。我可以从 A1 中取出 10 个数量,从 A2 中取出 10 个数量。但是相反,我必须查看 LOT_EXPIRY_DATE。由于A2先到期,我将从A2中取出14个数量,然后从A1中取出其余数量,即6个。

所以下面的查询工作得很好:

SELECT
     lot_num,
     item_num,
     quantity,
     lot_expiry_date,
     CASE
         WHEN req_quantity >= rolling_qty THEN quantity
         ELSE req_quantity - LAG(rolling_qty) OVER(
             ORDER BY
                 lot_expiry_date
         )
     END AS qty_fetched
 FROM
     (
         WITH base_inv_balance AS (
             SELECT
                 item_num,
                 lot_num,
                 quantity,
                 lot_expiry_date
             FROM
                 inventory
             WHERE
                 item_num = '101'
                 AND sub_inv = '22'
         ),requested_transaction AS (
             SELECT
                 '101' AS item_num,
                 20 AS req_quantity
             FROM
                 dual
         )
         SELECT
             base_inv_balance.item_num,
             base_inv_balance.lot_num,
             base_inv_balance.quantity,
             requested_transaction.req_quantity,
             base_inv_balance.lot_expiry_date,
             SUM(base_inv_balance.quantity) OVER(
                 PARTITION BY base_inv_balance.item_num
                 ORDER BY
                     base_inv_balance.lot_expiry_date
             ) AS rolling_qty
         FROM
             base_inv_balance
             JOIN requested_transaction ON base_inv_balance.item_num = requested_transaction.item_num
         ORDER BY
             base_inv_balance.item_num,
             base_inv_balance.lot_expiry_date
     )

结果:

LOT_NUM  ITEM_NUM QUANTITY LOT_EXPIRY_DATE QTY_FETCHED
A2       101      14       9/28/2019       14
A1       101      10       9/29/2019       6

但是如果请求的数量是13,那么结果就是

LOT_NUM  ITEM_NUM QUANTITY LOT_EXPIRY_DATE QTY_FETCHED
A2       101      14       9/28/2019       null
A1       101      10       9/29/2019       -1

预期结果:

LOT_NUM  ITEM_NUM QUANTITY LOT_EXPIRY_DATE QTY_FETCHED
A2       101      14       9/28/2019       13
A1       101      10       9/29/2019       0

是否可以使用一个查询同时处理这两个数量?

需要有关该查询的帮助。

你想要一个累加和和它们一些比较逻辑:

select i.*,
       (case when running_quantity < 20 then quantity
             when running_quantity - quantity < 20 then 20 + quantity - running_quantity
             else 0
        end) as qty_fetched
from (select i.*
             sum(quantity) over (partition by item_num, sub_inv order by lot_expiry_date) as running_quantity
      from inventory i
      where item_num = 101 and sub_inv = 22
     ) i;

Here 是一个 db<>fiddle.