私はあなたがこのようなものが必要だと思う:
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
以下のクエリは、自分のレベルによってソート列list2
でlist1
とセカンダリの主な承認者(複数可)を、示しています。割り当ては、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)
それが持つと文などせずに行うことは可能ですか?それが唯一のシニアポジション1を返す12000のproduct_amt
で
select pos_t.*
from prod_t
join pos_t on pos_t.username = prod_t.username
and pos_t.approval_limit <= prod_t.product_amt
where prod_t.prod_id = 'BC45'
and prod_t.product_amt = 50000;
USERNAME NAME POSITION SUPERIOR_POSITION_LEVEL_ID SUPERIOR_POSITION_NAME SUPERIOR_NAME SUPERIOR_USERNAME SUPERIOR_P APPROVAL_LIMIT
-------------------- --------------- --------------- -------------------------- ------------------------- --------------- ----------------- ---------- --------------
C1256 James Fin. Analyst 1 Sen.Analyst Ford 12735 782 10000
C1256 James Fin. Analyst 2 Manager Smith 329822 6218 50000
:
はい、ここのように:私の知る限りは、ちょうどテーマと連動あなたのテーブルを結合する必要があなたを言うことができるように
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に一致すると期待していますか? –