Аналитические функции были введены в значительной степени для этой цели ... избегайте необходимости читать одну и ту же таблицу более одного раза.Вам нужны два условных аналитических числа - когда читается tableA
(не все, только строки с "SQTY" > 0
, если это имеет значение), строки разбиваются на headerkey
, и два необходимых условных числарассчитывается.Затем вы можете отфильтровать результат чтения строк (и добавления аналитических функций), заменив предложение WHERE
.
Примерно так: (используя предложение WITH
, что делает код более читабельным)
WITH
PREP as (
SELECT *,
count(case when "STAT" < '33800' then 1 end)
over (partition by headerkey) as ct1,
count(case when "STAT" = '33800.100'
and "SDATE" between trunc(sysdate) - 7 and trunc(sysdate)
then 1 end) over (partition by headerkey) as ct2
FROM tableA
where "SQTY" > 0
),
RS2 as (
SELECT * -- or just the columns you need
FROM PREP
WHERE "PP_KEY" = '123'
AND TRIM(BOTH FROM "CTOLK") IS NULL
AND ct1 = 0
and ct2 > 0
)
SELECT *
FROM RS1
INNER JOIN TableB TB
on TB.headkey =Rs1.headerkey
INNER JOIN TableC TC
on TC.headkey =Rs1.headerkey
.....
..... {Several Inner joins on different tables}
.....
WHERE
.......