Sql 基于使用事务的Oracle累积金额

Sql 基于使用事务的Oracle累积金额,sql,oracle,sum,cumulative-sum,Sql,Oracle,Sum,Cumulative Sum,我需要根据一个条件对一个值进行累加求和,即该值要么匹配,要么仅比它应该匹配的列高一个记录值。我正在制作一个系统来跟踪订购的零件数量是否已完全使用。由于您可以在一个订单中订购多个数量,并且一次使用少量,因此我需要知道订购数量是何时使用的 例如: 子查询显示每个部件的使用事务 OrderNumber | PartNumber | OrderQty | LastUsageDate | Usage j55789 | ks568 | 8 | 10 - oct |

我需要根据一个条件对一个值进行累加求和,即该值要么匹配,要么仅比它应该匹配的列高一个记录值。我正在制作一个系统来跟踪订购的零件数量是否已完全使用。由于您可以在一个订单中订购多个数量,并且一次使用少量,因此我需要知道订购数量是何时使用的

例如:

子查询显示每个部件的使用事务

OrderNumber | PartNumber | OrderQty | LastUsageDate | Usage
j55789      |  ks568     |  8       |    10 - oct   |  2
j55789      |  ks568     |  8       |    11 - oct   |  2
j55789      |  ks568     |  8       |    11 - oct   |  2
j55789      |  ks568     |  8       |    12 - oct   |  2
j55789      |  ks568     |  8       |    13 - oct   |  2
这就是我的结果与上述信息的关系

OrderNumber | PartNumber | OrderQty | LastUsageDate | Usage
j55789      |  ks568     |  8       |    12 - oct   |  8
正如您所注意到的,结果会按其应该的方式将累计总和停止在8,并显示其应该的LastUsageDate。但是,当它运行累积总和时,如果它达到一个使总和大于OrderQty的数字,它不包括它,尽管它已被完全使用,但该部分将从结果中排除

这里有一个例子

OrderNumber | PartNumber | OrderQty | LastUsageDate | Usage
j55789      |  ks568     |  8       |    10 - oct   |  2
j55789      |  ks568     |  8       |    11 - oct   |  2
j55789      |  ks568     |  8       |    11 - oct   |  2
j55789      |  ks568     |  8       |    12 - oct   |  3
j55789      |  ks568     |  8       |    13 - oct   |  2
如果这是该零件的数据,则不会有任何结果,因为从10月11日到10月12日,累计总和为6到9天

我需要一种方法,使累计总和包括记录,即使总和将大于OrderQuantity,但它还需要停止超出该记录的计数。所以我的结果应该是

OrderNumber | PartNumber | OrderQty | LastUsageDate | Usage
j55789      |  ks568     |  8       |    12 - oct   |  9
以下是SQL:

    SELECT d1.* FROM(

    SELECT c1.*, max(c1.LastGiDate) LastGiDate, max(c1.cum_sum) GIQty  FROM(

    SELECT b1.*, SUM(b1.GiQty) OVER (PARTITION BY b1.MRNum, b1.PartNo ORDER BY b1.LastGiDate) cum_sum FROM(***subquery here***) c1

    WHERE c1.cum_sum <= c1.OrderQty

    GROUP BY ***c1 fields***) d1

    WHERE d1.GIQty >= d1.OrderQty;
WHERE子句限制求和的数据,但如果它不将求和放在OrderQuantity上,它将只包括下一个数字。我不知道如何更改此记录以包括下一条记录,即使它确实超出了订单数量。

像这样

with d as (
-- Test Data
SELECT 'j55789' order_Number, 'ks568' part_Number,  8 order_qty, to_date('10-OCT-2015') last_usage_date, 2 usage FROM DUAL union all 
SELECT 'j55789' order_Number, 'ks568' part_Number,  8 order_qty, to_date('11-OCT-2015') last_usage_date, 2 usage FROM DUAL union all 
SELECT 'j55789' order_Number, 'ks568' part_Number,  8 order_qty, to_date('11-OCT-2015') last_usage_date, 2 usage FROM DUAL union all 
SELECT 'j55789' order_Number, 'ks568' part_Number,  8 order_qty, to_date('12-OCT-2015') last_usage_date, 3 usage FROM DUAL union all 
SELECT 'j55789' order_Number, 'ks568' part_Number,  8 order_qty, to_date('13-OCT-2015') last_usage_date, 2 usage FROM DUAL ),
-- Step 1: Get the running sum for each record 
step1 as ( SELECT d.*, sum(usage) over ( partition by order_number, part_number order by last_usage_date) running_sum FROM d ),
-- Step 2: Filter our records that started out beyond our order_qty
step2 as ( SELECT step1.*, row_Number() over ( partition by order_number, part_number order by running_sum desc ) rn from step1 WHERE running_sum - usage < order_qty )
-- Report on the last unfiltered record in the group 
select order_Number, part_number, order_qty, last_usage_date, running_sum usage from step2 where rn = 1

我想这可能行得通。我需要在我的代码中快速实现它,如果我还有问题,我会更新。实际上我有一个问题。有没有办法修改它,使其在为null时也显示usage列。有些部分还没有任何用法,这只显示有某种用法的行。