分配数量的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章