2015-11-12 2 views
0

Мне нужно суммировать сумму, основанную на условии, что значение либо соответствует, либо является только одним значением записи, превышающим столбец, которому он должен соответствовать. Я делаю систему, чтобы отслеживать, было ли полностью использовано количество деталей, которые были заказаны. Поскольку вы можете заказать несколько штук в одном заказе и использовать небольшие объемы за раз, мне нужно знать, когда использовалось количество заказа.Суммарная сумма Oracle на основе транзакций использования

Пример:

Subquery показывает транзакции использования для каждой части

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 

Если это данные для части, это не будет иметь никаких результатов, поскольку совокупная сумма идет от 6 до 9 из дней 11-Окт 12-Окт.

Мне нужно, чтобы сумма суммарной суммы включала запись, даже если сумма была бы больше, чем OrderQty, но она также должна прекратить считать за этой записью. Так что мой результат должен быть.

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; 

ИНЕКЕ ограничивает данные, которые получает суммируются, но она будет включать в себя только на следующий номер, если оно не поставить cum_sum над OrderQty. Я не уверен, как изменить это, чтобы включить следующую запись, даже если она идет выше OrderQty.

ответ

0

Нравится?

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 
+0

Я думаю, что это может сработать. Мне нужно быстро реализовать его в моем коде, и я обновлю, если у меня появятся вопросы. – Zionmoose

+0

На самом деле у меня есть вопрос. Есть ли способ изменить это, чтобы он также показывал столбец использования, если он равен нулю. Есть некоторые части, которые пока не имеют никакого использования, это только показывает строки, которые имеют какое-то использование. – Zionmoose

+0

Nevermind, я считаю, что я решил нулевую проблему. – Zionmoose

Смежные вопросы