我想你需要的東西是這樣的:
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
下面的查詢顯示了list1
縱隊主力審批人(S)和次級在list2
,通過自己的水平進行排序。分配是根據prod_t
中的值動態構建的。
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)
是否有可能不具有和語句呢?
是的,就像這裏:
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
我不確定這是否仍然清楚;你可以添加你期望看到的結果,以及迄今爲止嘗試過的結果嗎?(也不知道爲什麼你在'pos_t'中有重複/非規範化的數據,但希望這只是一個演示) –
您的案例表達式與50000中的任何內容都不匹配,我想這是一個錯誤;你只需要在每個分支中進行檢查?但是,它應該與上級2,3和4匹配;你爲什麼期望它匹配1和2? –