Ich glaube, Sie brauchen etwas wie folgt aus:
with amounts as (
select username, nvl(lag(product_amt) over (order by product_amt), 0) amt1,
product_amt amt2
from prod_t where username = 'C1256' and prod_id = 'BC45')
select amt1, amt2, approval_limit, superior_name,
case when amt1 < approval_limit then 'PRIMARY' else 'SECONDARY' end as type
from amounts
join pos_t on amounts.username = pos_t.username and approval_limit <= amt2
where amt1 < 50000 and 50000 <= amt2
order by amt2, approval_limit desc;
=========================================================================
AMT1 AMT2 APPROVAL_LIMIT SUPERIOR_NAME TYPE
---------- ---------- -------------- ---------------- ---------
12000 50000 50000 Smith PRIMARY
12000 50000 10000 Ford SECONDARY
Die Abfrage zeigt Haupt Zustimmung Person (en) in der Spalte list1
und Sekundär in list2
, von ihrem Niveau sortiert. Die Zuweisung wird dynamisch abhängig von Werten in prod_t
erstellt.
with amounts as (
select row_number() over (order by product_amt) rn,
nvl(lag(product_amt) over (order by product_amt), 0) amt1,
product_amt amt2
from prod_t)
select rn, amt1, amt2,
(select listagg(superior_name, ',')
within group (order by pos_t.superior_position_level_id desc)
from pos_t where amt1 < approval_limit and approval_limit <= amt2) list1,
(select listagg(superior_name||' ('||approval_limit||')', ',')
within group (order by pos_t.superior_position_level_id desc)
from pos_t where approval_limit <= amt1) list2
from amounts
order by rn
=========================================================================
RN AMT1 AMT2 LIST1 LIST2
------ ---------- ---------- --------- ------------------------------------------
1 0 12000 Ford
2 12000 50000 Smith Ford (10000)
3 50000 120000 Jack Smith (50000),Ford (10000)
4 120000 500000 Scott Jack (100000),Smith (50000),Ford (10000)
Ist es möglich, ohne mit und als Aussagen zu tun?
Ja, wie hier:
select amt1, amt2, approval_limit, superior_name,
case when amt1 < approval_limit then 'PRIMARY' else 'SECONDARY' end type
from (
select username, nvl(lag(product_amt) over (order by product_amt), 0) amt1,
product_amt amt2
from prod_t where username='C1256' and prod_id = 'BC45') amounts
join pos_t on amounts.username = pos_t.username and approval_limit <= amt2
where amt1 < 50000 and 50000 <= amt2
order by amt2, approval_limit desc
Ich bin mir nicht sicher, das ist immer noch klar; Können Sie das Ergebnis hinzufügen, das Sie erwarten und was Sie bisher versucht haben?(Auch nicht sicher, warum du/denormierte Daten in 'pos_t' dupliziert hast, aber hoffentlich ist das nur eine Demo) –
Dein Fallausdruck stimmt auf 50000 genau nicht überein, was ich mir vorstelle, ist ein Fehler; Sie brauchen nur die '<' Prüfung in jedem Zweig? Aber damit sollte es den Vorgesetzten 2, 3 und 4 entsprechen; Warum erwartest du, dass es 1 und 2 entspricht? –