2011-12-19 13 views
3

もっと私はそれが私が混乱していると思うほど、それはかなりの間、私はいくつかの複雑なSQLを書いている可能性があります。範囲の間の値を取得

値の範囲を持つテーブルがあります。それを範囲と呼ぶことができます:

RANGE 
RANGE_ID RANGE_SEQ MIN MAX FACTOR 
     1   1  0 10  1 
     1   2 11 100  1.5 
     1   3 101   2.5 
     2   1  0 18  1 
     2   2 19    2 

そして、私はこれらの範囲を使用するanotheテーブルを持っています。私は範囲の間に入るものRAW_VALUESを取得したいアプリケーション

APPLICATION 
APP_ID RAW_VALUE RANGE_ID FINAL_VALUE 
    1   20.0  1   30.0  /*In Range 1, 20 falls between 11 and 100, so 1.5 is applied)*/ 
    2   25.0  2   50.0 
    3   18.5  2   18.5 

それを呼び出すことができます。そう範囲2ため、私はRAW_VALUE同様範囲1 18〜19を有するものAPP_ID Sをしたい、私はRAW_VALUE

10〜11と100と101を有しているもの APP_ID S Iは知りたいと望みますこれがSQLで可能かどうか、私が試してみることのできるいくつかの点について説明します。私はSQL自体を必要としません、アプローチのほんの一部です。

答えて

1

あなたは非マッチ(テーブルに存在しないすなわちraw_values)を取得するには

select app_id,raw_value,aa.range_id,raw_value * xx.factor as FinaL_Value 
from Application_table aa 
join range_table xx on (aa.raw_value between xx.min and xx.max) 
        and (aa.range_id=xx.range_id) 

を近づけるために、これを試してみてください、私はあなたがしている理解してどのようなことから、この

select app_id,raw_value,aa.range_id 
from Application_table aa 
left join range_table xx on (aa.raw_value between xx.min and xx.max) 
        and (aa.range_id=xx.range_id) 
where xx.range_id is null 
+0

'私はSQL自体を必要としませんが、アプローチのほんの一部です。 ' –

+2

SQLを使って説明するのが簡単なものがいくつかありますその後、英語でスペルをします。 – Sparky

+0

これには、範囲INの値も含まれます。 '1 - 10'と' 11 - 20'の範囲では、10と11の間の値しか必要としません。だから、私は '10.5 'を望んでいるが、' 5'は望んでいない。 – Nivas

0

を試してみてくださいどの範囲にも適合しないアプリケーションテーブルからの結果だけが必要だと言っていますか?これは、例えば、APP_ID = 3のためだけの行を返す(私自身のカラム名と推測本物の最小値と最大額で)になります。

select * 
from APP1 A 
where not exists 
     (select null 
      from RANGE1 R 
      where R.RANGE_ID = A.RANGE_ID and A.RAW_VALUE between nvl(R.MINNUM, 0) and nvl(R.MAXNUM, 999999)); 

しかし、もちろん、それはとして因数量を返しません範囲テーブルの行が一致しないため、上記の例のapp_id = 3の結果がfactor = 1と一致するのはなぜですか?あなたのraw_value列が10進数になる場合は、範囲も小数であると予想します。

1
create table tq84_range (
    range_id number not null, 
    range_seq number not null, 
    min_  number not null, 
    max_  number, 
    factor  number not null, 
-- 
    primary key (range_id, range_seq) 
); 

insert into tq84_range values (1, 1, 0, 10, 1.0); 
insert into tq84_range values (1, 2, 10, 100, 1.5); 
insert into tq84_range values (1, 3,101,null, 2.5); 

insert into tq84_range values (2, 1, 0, 18, 1.0); 
insert into tq84_range values (2, 2, 19,null, 2.0); 

create table tq84_application (
    app_id  number not null, 
    raw_value number not null, 
    range_id number not null, 
    primary key (app_id) 
); 

insert into tq84_application values (1, 20.0, 1); 
insert into tq84_application values (2, 25.0, 2); 
insert into tq84_application values (3, 18.5, 2); 

left joinを使用します。こうした左で

あなたは左 テーブルのレコードが(表が select文のテキストで前left joinに登場する)条件はdoesnのどこにもかかわらず 、少なくとも一回返されることを保証する、参加します右側の表に のレコードがあります。

の場合、結合 条件ではtq84_rangeのレコードが見つかりませんでしたので、そこには のようにギャップがあるようです。だからMissing:を印刷します。

tq84_application.max_nullすることができ、nullは に表示されますので、あなたがnvl(tq84_range.max_, tq84_application.raw_value

で上限 をテスト無限は上限を示ししたがって、select文のようなものになるだろう:

select 
     case when tq84_range.range_id is null then 'Missing: ' 
      else         '   ' 
      end, 
     tq84_application.raw_value 
    from 
     tq84_application  left join 
     tq84_range 
    on 
     tq84_application.range_id = tq84_range.range_id 
    and 
     tq84_application.raw_value between 
     tq84_range.min_ and nvl(tq84_range.max_, tq84_application.raw_value); 
関連する問題