oracle 与初始值的累计差值

g52tjvyc  于 2023-05-16  发布在  Oracle
关注(0)|答案(2)|浏览(127)

计算前一行值和当前行值之间的累积差值
这与生产有关。qty_needed和qty_onhand是在数据库中获取的给定值。我想用累积差异结果替换qty_onhand中显示的值,因为它是一个连接查询,所以会重复显示。希望你能帮我处理这件事。
样品运行显示数据。

qty_needed      qty_onhand
5                 10                  
5                 10
5                 10

要获取remaining_onhand列,这里是示例。
qty_onhand的初始值= 10。
公式:所需数量-现有数量

qty_needed          qty_onhand
    5                 10                  
    5                 10-5 = 5
    5                 5-5 = 0

SAMPLE SCRIPT:

CASE 
WHEN ROW_NUMBER () 
OVER (PARTITION BY component 
ORDER BY partno) = 
1 
THEN 
qty_on_hand 
WHEN qty_on_hand - SUM (qty_needed) 
OVER (PARTITION BY component ORDER BY partno ROWS UNBOUNDED PRECEDING) <= 0 
THEN 
0 
ELSE 
qty_on_hand - SUM (qty_needed) 
OVER (PARTITION BY component ORDER BY partno ROWS UNBOUNDED PRECEDING) 
END AS testQtyNeeded
zengzsys

zengzsys1#

对于可重复的结果,您需要一些一致的逻辑来对行进行排序。这里我使用over(order by 1)分配了一个行号,它不能保证完全匹配行插入的顺序,但通常与此接近。理想情况下,你会有一些其他列(一些日期也许?),可以使用。然后假设你想弄清楚什么时候重新排序,这种方法可能会有所帮助:

WITH assign_rn
AS (
    SELECT data.*
        , row_number() OVER (
            ORDER BY 1
            ) AS rn
        , sum(qty_needed) OVER (
            PARTITION BY component ORDER BY 1 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 preceding
            ) cum_needed
    FROM data
    )
SELECT partno
    , component
    , rn
    , qty_needed
    , qty_on_hand
    , qty_on_hand - cum_needed qty_after_use
    , CASE WHEN qty_on_hand - cum_needed <= 0 THEN 're-order' ELSE NULL END AS note
FROM assign_rn
ORDER BY component
    , rn
PARTNO组件RN需要数量手头数量使用后数量注意事项
一百零一AX系列110个联系我们
一百零三AX系列10个0再订购
一百零二AX系列10个-5再订购

fiddle
注:通常也会有一些关于再订购水平的可用数据,但是如果这样的数据存在,则可以将其引入到上面看到的情况表达式中。

gijlo24d

gijlo24d2#

您可以使用Sum()OVER()分析函数来计算所需数量的运行总和。

Select  NEEDED, ONHAND,
        ONHAND - Nvl(Sum(NEEDED) OVER(Partition By 1 Order By 1 Rows Between Unbounded Preceding And 1 Preceding), 0) "ONHAND_CALC" 
From tbl

。。。用你的样本数据

WITH
    tbl (NEEDED, ONHAND) AS
        (
            Select 5, 10 From Dual Union All
            Select 5, 10 From Dual Union All
            Select 5, 10 From Dual
        )

...结果如下:

NEEDED     ONHAND ONHAND_CALC
---------- ---------- -----------
         5         10          10 
         5         10           5 
         5         10           0

注意:(Partition By 1 Order By 1) 应根据您的需要进行调整。您可能有一些东西可以用来对行进行分区和排序。

相关问题