Вычитание промежуточного итога до 0 - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь получить итоговое вычитание для моего столбца avail_relief_amt.Цель состоит в том, чтобы сделать (qty_filled / qty_total) максимально близким к 100%, для чего предназначен столбец room_to_improve.

Текущий запрос:

    SELECT
    t2_date,
    part_no,
    issue_group,
    level,
    p_category,
    qty_filled,
    qty_total,
    relief_amt,
    curr_mth_note,
    carryover_note,
    room_to_improve,
    avail_relief_amt,
    CASE
        WHEN avail_relief_amt != 0 THEN ( qty_total - room_to_improve )
        ELSE NULL
    END AS new_qty_total
FROM
    (
        SELECT
            t2_date,
            part_no,
            issue_group,
            level,
            p_category,
            qty_filled,
            qty_total,
            relief_amt,
            curr_mth_note,
            carryover_note,
            CASE
                WHEN qty_filled < qty_total THEN ( qty_total - qty_filled )
                ELSE NULL
            END AS room_to_improve,
            avail_relief_amt
        FROM
            (
                SELECT
                    t2_date,
                    part_no,
                    issue_group,
                    level,
                    p_category,
                    qty_filled,
                    qty_total,
                    relief_amt,
                    curr_mth_note,
                    carryover_note,
                    CASE
                        WHEN curr_mth_note IS NOT NULL THEN relief_amt
                        ELSE NULL
                    END AS avail_relief_amt
                FROM
                    (
                        SELECT
                            t1.t2_date,
                            t1.part_no,
                            t1.issue_group,
                            t1.level,
                            t1.p_category,
                            t1.qty_filled,
                            t1.qty_total,
                            mv.relief_amt,
                            mv.curr_mth_note,
                            mv.carryover_note
                        FROM
                            table_detail_mv mv,
                            table_part_con t1
                        WHERE
                            t1.part_no = mv.part_no
                            AND t1.t2_date = mv.t2_date
                        GROUP BY
                            t1.t2_date,
                            t1.issue_group,
                            t1.level,
                            t1.part_no,
                            t1.p_category,
                            t1.qty_filled,
                            t1.qty_total,
                            mv.relief_amt,
                            mv.curr_mth_note,
                            mv.carryover_note
                        ORDER BY
                            t1.t2_date,
                            t1.issue_group,
                            t1.level DESC
                    )
            )
    )
ORDER BY
    t2_date,
    part_no,
    issue_group,
    level DESC

Токовый выход:

enter image description here

Столбец avail_relief_amt начинается с любого числа в столбце relief_amt.Если avail_relief_amt > room_to_improve, следующий avail_relief_amt должен быть тем, что осталось от (avail_relief_amt - room_to_improve).В моем выводе выше, поскольку для строки 2 нет room_to_improve, поэтому необходимо перейти к следующему ряду и т. Д. До avail_relief_amt = 0.

Требуемый выход:

enter image description here

Редактировать

Iя удалил столбцы room_to_improve, avail_relief_amt и new_qty_total из моего запроса, так как они были добавлены в мыслях о том, чтобы помочь визуализировать мою конечную цель.

Токовый выход (без вышеуказанных столбцов):

enter image description here

Лучшее объяснение конечной цели:

  • Получение qty_total / qty_filled как можно ближе к 100%, путем взятия от relief_amt до тех пор, пока оно не станет равным 0.
  • relief_amt опустится вниз по приоритетной линии (игнорируя опоздание).Порядок приоритета: (issue_group='1', s_level='80') - (issue_group='1', s_level='100') - (issue_group='2/3 ', s_level='80') - (issue_group='2/3 ', s_level='100')
  • . С указанным выше выводом необходимо 27, чтобы сделать qty_total = qty_filled,так что это число взято из relief_amt (из 57).Оставляя relief_amt=30.
  • Затем запрос переходит к следующему приоритету, но, поскольку 94 = 94, нет необходимости использовать relief_amt, поэтому он переходит к следующей строке (не обращая внимания на пропуск«Поздний»).
  • Теперь нам нужно получить qty_total=226, ближе к qty_filled=125, но у нас есть только relief_amt=30.Таким образом, оставшиеся relief_amt взяты из этого qty_total=226, что делает этот новый qty_total=196, и тогда у нас кончается relief_amt.

Это очень запутанно, я знаю, и меня имои коллеги довольно озадачены из-за всех переменных и повторяющихся уравнений.

Любая помощь будет отличной!

1 Ответ

0 голосов
/ 19 декабря 2018

У меня есть решение, но поскольку у вас не было исходных данных, мое решение использовало ваш запрос как представление.

Итак, вы должны создать представление с синтаксисом:

create view currentOutput as select ...your current query here... ;

Кроме того, вам нужно поле даты, которое, как я предполагал, будет иметь имя типа dateEntry.

И тогда вы сможете сделать следующее:

 SELECT dateEntry,
       room_to_improve,
       CASE
           WHEN temp.AVAIL_RELIEF_AMT - NVL(SUMPREVIOUSROOMTOIMPROVE, 0) < 0 THEN 0
           ELSE temp.AVAIL_RELIEF_AMT - NVL(SUMPREVIOUSROOMTOIMPROVE, 0)
       END AS AVAIL_RELEIF_AMT,
       new_qty_total
FROM
  ( SELECT c1.*,

     (SELECT sum(room_to_improve)
      FROM currentOutput
      WHERE dateEntry < c1.dateEntry) AS sumPreviousRoomToImprove
   FROM currentOutput c1
   ORDER BY dateEntry )TEMP ;

Результат:

DATEENTRY -ROOM_TO_IMPROVE-   AVAIL_RELEIF_AMT-   NEW_QTY_TOTAL-
1-    27  -57-    67
2-        -30-    
3-    101-    -30-    125
4-    49- 0-  177-

Скрипка: https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=2c074fe2adc232fd596d623e1cee8123

...