基于其他表分组编号

byl*_*.05 2 sql oracle

我有一个挑战,我必须建立一些查询,我对如何开始有点迷失.我想我可能需要使用分区来实现这一点,但不确定他们的方式.所以,如果有人可以与我分享知识:)

首先抱歉令人困惑的tittle,但老实说,不知道如何用一行描述它:(

问题是我有两张桌子:

库存

ITEM    QTY    PRIORITY
-----------------------------
ITEM1   10     1
ITEM1   5      2
ITEM1   4      3
ITEM1   7      4
ITEM2   4      1
ITEM2   19     2
Run Code Online (Sandbox Code Playgroud)

LIST

ITEM       QTY
-----------------
ITEM1      17
ITEM2      13
Run Code Online (Sandbox Code Playgroud)

我需要实现的逻辑是表LIST从INVENTORY表中删除了数量.但它必须按项目执行并删除优先级中的数量.例如:

在LIST表中,我们有ITEM1 = 17这意味着我们需要按照优先级顺序删除Inventory表中的这个数量.

  1. 首先从第一优先级中删除(qty = 10 - 10 - >我们还有7个来自LIST表)
  2. 然后从第二优先级中删除(qty = 5 - 5 - >我们仍然有2个来自LIST表)
  3. 然后从第三优先级删除(qty = 4 - 2 !!! - >我们只剩下2个LIST表)

因此ITEM1的结果如下:

ITEM    QTY    PRIORITY
-----------------------------
ITEM1   0      1
ITEM1   0      2
ITEM1   2      3
ITEM1   7      4
Run Code Online (Sandbox Code Playgroud)

如果将整个逻辑应用于所有项目,则生成的查询应返回如下内容:

ITEM    QTY    PRIORITY
-----------------------------
ITEM1   0      1
ITEM1   0      2
ITEM1   2      3
ITEM1   7      4
ITEM2   0      1
ITEM2   10     2
Run Code Online (Sandbox Code Playgroud)

有人知道我怎么能接近这个?

MT0*_*MT0 5

Oracle安装程序:

CREATE TABLE inventory ( item, qty, priority ) AS
SELECT 'ITEM1', 10, 1 FROM DUAL UNION ALL
SELECT 'ITEM1',  5, 2 FROM DUAL UNION ALL
SELECT 'ITEM1',  4, 3 FROM DUAL UNION ALL
SELECT 'ITEM1',  7, 4 FROM DUAL UNION ALL
SELECT 'ITEM2',  4, 1 FROM DUAL UNION ALL
SELECT 'ITEM2', 19, 2 FROM DUAL;

CREATE TABLE list ( item, qty ) AS
SELECT 'ITEM1', 17 FROM DUAL UNION ALL
SELECT 'ITEM2', 13 FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

查询:

MERGE INTO inventory dst
USING (
  SELECT i.item,
         LEAST(
           GREATEST(
             SUM( i.qty ) OVER ( PARTITION BY i.item ORDER BY i.priority )
               - COALESCE( l.qty, 0 ),
             0
           ),
           i.qty
         ) AS qty,
         i.priority
  FROM   inventory i
         LEFT OUTER JOIN
         list l
         ON ( i.item = l.item )
) src
ON ( src.item = dst.item AND src.priority = dst.priority )
WHEN MATCHED THEN
  UPDATE SET qty = src.qty;
Run Code Online (Sandbox Code Playgroud)

输出:

SELECT * FROM inventory;

ITEM  QTY PRIORITY
----- --- --------
ITEM1   0        1
ITEM1   0        2
ITEM1   2        3
ITEM1   7        4
ITEM2   0        1
ITEM2  10        2
Run Code Online (Sandbox Code Playgroud)