2016-08-03 7 views
0

私は、製品の量に基づいて承認限度を取得する必要があります。 など。 - 製品の数量が10000未満の場合は、対応する承認者を取得してください。そして、その後、製品に基づく条件付き承認レベル

  • 製品量が10000より大きく50000未満の場合、製品の量が50000より大きく、100000未満の場合は10000上限

  • の下に対応する承認者と人物を取得し、製品の量が100000未満500000よりも大きい場合は、対応する承認者と50000リミット

  • 以下のすべての人を取得し、その後、対応する承認者と100000制限

  • を以下のすべての人を取得

これを実現するには、製品の量と承認限度をハードコーディングする必要はありません。つまり、テーブル内の値が変更されるため動的でなければなりません。

+0

これはまだわかりません。あなたが見たいと思っている結果と、これまでに試したことを追加できますか?(なぜ、あなたが 'pos_t'に複製/非正規化されたデータを持っているのかも分かりませんが、うまくいけばデモだけです) –

+0

あなたのケース式は正確に50000のものと一致しません。各ブランチで '<'チェックが必要なだけですか?しかし、それは上司2,3,4と一致するはずです。なぜそれが1と2に一致すると期待していますか? –

答えて

1

; 120000の場合は1,2および3を返します。 500000の場合、1,2,3,4が返されます。これは、あなたが何を記述し、期待しているかのようです。

あなたが唯一持っているなら、あなたはあなたがdistinct必要がある場合にはすべての値のレベルを取得することができprod_id

select distinct 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'; 

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        4 Chief Executive   Scott   13457     2987   500000 
C1256    James   Fin. Analyst        2 Manager     Smith   329822     6218   50000 
C1256    James   Fin. Analyst        3 General Manager Finance Jack   23512     727   100000 

をか、そのprod_idのための最高のproduct_amtを見つけると、それに限らせていただきます同じ答えを得るが、のようなもので、たとえば、より効率的になります。

select pos_t.* 
from (
    select max(username) keep (dense_rank last order by product_amt) as username, 
    max(product_amt) as product_amt 
    from prod_t 
    where prod_id = 'BC45' 
) prod_t 
join pos_t on pos_t.username = prod_t.username 
and pos_t.approval_limit <= prod_t.product_amt; 

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 
C1256    James   Fin. Analyst        3 General Manager Finance Jack   23512     727   100000 
C1256    James   Fin. Analyst        4 Chief Executive   Scott   13457     2987   500000 

それとも、同時に各product_amtためのマッチングデータが必要な場合は、 distinctを除外して、一致するものがわかるように金額を含めてください:

select prod_t.product_amt, 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'; 

PRODUCT_AMT USERNAME    NAME   POSITION  SUPERIOR_POSITION_LEVEL_ID SUPERIOR_POSITION_NAME SUPERIOR_NAME SUPERIOR_USERNAME SUPERIOR_P APPROVAL_LIMIT 
----------- -------------------- --------------- --------------- -------------------------- ------------------------- --------------- ----------------- ---------- -------------- 
    120000 C1256    James   Fin. Analyst        1 Sen.Analyst    Ford   12735     782   10000 
    500000 C1256    James   Fin. Analyst        1 Sen.Analyst    Ford   12735     782   10000 
     50000 C1256    James   Fin. Analyst        1 Sen.Analyst    Ford   12735     782   10000 
     12000 C1256    James   Fin. Analyst        1 Sen.Analyst    Ford   12735     782   10000 
    120000 C1256    James   Fin. Analyst        2 Manager     Smith   329822     6218   50000 
    500000 C1256    James   Fin. Analyst        2 Manager     Smith   329822     6218   50000 
     50000 C1256    James   Fin. Analyst        2 Manager     Smith   329822     6218   50000 
    120000 C1256    James   Fin. Analyst        3 General Manager Finance Jack   23512     727   100000 
    500000 C1256    James   Fin. Analyst        3 General Manager Finance Jack   23512     727   100000 
    500000 C1256    James   Fin. Analyst        4 Chief Executive   Scott   13457     2987   500000 
+0

パラメータとしてprod_idのみを渡すことができます – user75ponic

+0

例のすべての 'prod_t'行は同じ' prod_id'を持っています。ですから、その列だけをフィルタリングすれば、どんな出力が必要ですか?その 'prod_id'のために最も高い' product_amt'と一致する 'pos_t'はありますか?どんな金額にも一致するものはすべて(これは同じものになるでしょう)? –

1

私はあなたがこのようなものが必要だと思う:

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 

以下のクエリは、自分のレベルによってソート列list2list1とセカンダリの主な承認者(複数可)を、示しています。割り当ては、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 
関連する問題