2017-03-15 11 views
0

それで、相互に排他的ではない範囲を使用して行を数える方法があるのだろうか?SQL - 範囲を使用してカウントするが、排他的ではない

_ValueA_,_ValueB_,_ValueC_ 
    E1 | 1 | 0 
    E2 | 6 | 1 
    E3 | 12 | 4 
    E4 | 23 | 2 

_ValueX_,_ValueY_ 
    X1 | 0 
    X2 | 1 
    X3 | 4 
    X4 | 2 

そして、私は次のような結果が欲しい::(おそらく悪い言葉遣い)

のは、私は、次の表があるとしましょう、私はネストされたCASE WHENステートメントを使用している実行しようとしました何

_VRange_,_ValueA_,_ValueB_,_ValueC_,_ValueX_ 
    <5 | E1 | 1 | 0 | X1 
    <10 | E1 | 1 | 0 | X1 
    <10 | E2 | 6 | 1 | X2 
    <15 | E1 | 1 | 0 | X1 
    <15 | E2 | 6 | 1 | X2 
    <15 | E3 | 12 | 4 | X3 
.... 

CASE WHEN ValueA < 5 THEN '<5' VRange ELSE 
    CASE WHEN ValueA < 10 THEN '<10' ELSE 
     -- Nested to 20 
    END 
END 

ですが、これは排他的です(つまり、あなたのValueAは、それはそれは

は、私は、単にWHERE条項に従ってで選択UNIONを使用してみました)< 10枝に入ることはありません5の上にもあるが、それは結果ので、それは、クロールにスロークエリを作った、10を超えています基本的に私のテーブル(s)cardinality times 10だったセットでも、それはひどく長いために参加していました。

いい方法があります。

私はOracle DBを使用していますので、Oracle固有の構文を使用しないようにしたいと思いますが、クエリが短くなる場合は、私の目的には何も見つかりませんでした。

アイデア?

+0

は、case式の開始時に、あなたの最大値を置きます。つまり'valuea> 20の場合は '> 20'、valuea <10なら '<10' ... end'です。また、ケースの式をネストする必要はありません。複数のwhen節を持つことができます! Oracleは、一致する最初のwhen句に達すると停止します。 – Boneist

+0

それはまさに私が欲しくないことです、私は繰り返しが欲しいです。私はいくつかの節(<5、<10、<15、<20)を持っています。もし3のような値があれば、その結果をVRange欄に<5 。また、私はそれらを単一の列に入れるために自分のケースを入れ子にしなければならないと思いましたか? – Wep0n

+0

この場合、サブクエリで範囲を定義してから、その範囲にテーブルを参加させる必要があります。これは、ゴードン氏の答えに示されています。 – Boneist

答えて

1

あなたはjoinを使用してこれを実行する必要があるとしている。

with t as (<your query here>), 
    vals as (
     select 5 as lim, '< 5' as vrange from dual union all 
     select 10 as lim, '< 10' as vrange from dual union all 
     . . . 
    ) 
select vals.vrange, t.* 
from t join 
    vals 
    on t.ValueA < vals.lim; 
+0

with-asステートメントの右括弧と次のselectステートメントの間に何かがありませんか?編集:気にしない、私はそれを得た。ありがとう、論理derpのために申し訳ありません。私は物事を私よりもはるかに複雑にすることが好きです。 – Wep0n

関連する問題