分配数量的 Oracle SQL 查询

Posted

技术标签:

【中文标题】分配数量的 Oracle SQL 查询【英文标题】:Oracle SQL Query for Distributing Quantity 【发布时间】:2020-09-24 01:01:16 【问题描述】:

我有一张名为 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 

假设,我有一个请求从这些 LOT 中提取 20 个数量。根据表格,我的可用总量为 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

是否有可能有一个查询可以同时处理两个数量?

需要有关该查询的帮助。

【问题讨论】:

【参考方案1】:

你想要一个累积和他们一些比较逻辑:

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 是一个 dbfiddle。

【讨论】:

谢谢,戈登!但是这个查询从 A2 和 10 A1 获取 14。预期:A2 中的 14 个和 A1 中的 6 个。在所需数量为 13 的情况下,它从 A2 获取 14,从 A1 获取 0。预期:A2 中的 13 个和 A1 中的 0 个。 @rish 。 . .我修好了。

以上是关于分配数量的 Oracle SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle: 两个SQL语句查询数量不一致。

在Oracle的SQL查询中获取固定数量的行[重复]

用于分配付款的 Oracle SQL 查询

oracle 用SQL查询一个时间段每天的数据量

oracle里怎么对sql查询的日志进行查看

Oracle查询语句