Я пытался использовать предложение WITH, но для этого вам нужно использовать предложение FROM, мое предложение FROM является массивным и выглядело бы так же безобразно, если бы я использовал предложение WITH (плюс вместо повторения SELECTзаявление сейчас я бы просто повторил заявление ОТ).
Вам не нужно повторять предложение from
.Вы перемещаете весь запрос, включая это предложение, в CTE;вы просто вытаскиваете биты, которые основаны на предыдущих вычислениях, в основной запрос, что позволяет избежать повторения кода.
Структура будет выглядеть примерно так:
WITH cte AS (
SELECT
all_nbr.total_qty,
NVL (avail_nbr.avail_qty, 0) AS avail_qty,
100 * TRUNC ( (NVL (avail_nbr.avail_qty, 0) / all_nbr.total_qty), 2) AS pct_avail,
FROM
...
)
SELECT
cte.total_qty,
cte.avail_qty,
cte.pct_avail,
CASE
WHEN cte.avail_qty, 0 < 35
THEN CASE
WHEN cte.total_qty < 35
THEN 35 - cte.avail_qty
ELSE 0
END
ELSE 0
END AS "LOW_CNT_&%"
FROM
cte;
Ваш основной запрос должен толькообратитесь к CTE (опять же, основываясь на том, что вы показали), и можете (только) обратиться к проекту CTE, включая вычисленные столбцы.Он не может видеть базовые таблицы, но не должен это делать.
Или вместо встроенного представления принципал такой же:
SELECT
total_qty,
avail_qty,
pct_avail,
CASE
WHEN avail_qty < 35
THEN CASE
WHEN total_qty < 35
THEN 35 - avail_qty
ELSE 0
END
ELSE 0
END AS "LOW_CNT_&%"
FROM
(
SELECT
all_nbr.total_qty,
NVL (avail_nbr.avail_qty, 0) AS avail_qty,
100 * TRUNC ( (NVL (avail_nbr.avail_qty, 0) / all_nbr.total_qty), 2) AS pct_avail,
FROM
...
);