2017-03-15 2 views
0

So frage ich mich, gibt es eine Möglichkeit, Zeilen mit Bereichen zu zählen, die sich nicht gegenseitig ausschließen? (Wahrscheinlich schlechte Formulierung)SQL - Zählen mit Bereichen, aber nicht ausschließlich

Lassen Sie uns sagen, dass ich die folgenden Tabellen:

_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 

Und ich möchte folgendes Ergebnis:

_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 
.... 

Was ich versucht zu tun ist eine verschachtelte CASE WHEN Anweisung verwenden,

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

aber da ist das exklusiv (In dem Sinne, wenn Ihre ValueA ist über 10, es ist auch über 5 so wird es nie in die < 10 Zweigstellen)

ich einfach auch versucht, ein UNION wähle mit nach WHERE Klauseln verwenden, aber das machte die Abfrage langsam zu einem Schleichen, weil es in Folge in einem Set, das im Grunde genommen die Kardinalität meiner Tabelle (n) war, war es zehn, außerdem war es schrecklich lang wegen der Join.

Es gibt einen besseren Weg!

Ich bin auf einer Oracle DB, ich möchte vermeiden, Oracle-spezifische Syntax zu verwenden, aber ich kann, wenn das eine kürzere Abfrage bietet, konnte ich wirklich nichts für meine Zwecke finden, obwohl.

Irgendwelche Ideen?

+0

zu Beginn des Falles Ausdruck setzen Sie Ihre größten Werte. Ie. 'case wenn valuea> 20 dann '> 20' wenn valuea <10 dann '<10' ... end '. Außerdem müssen Sie Ihre Fallausdrücke nicht verschachteln. Sie können mehrere when-Klauseln haben! Oracle stoppt, wenn es die erste when-Klausel erreicht, die übereinstimmt. – Boneist

+0

Aber genau das will ich nicht, ich will die Wiederholung. Ich habe ein paar verschiedene Klauseln (<5, <10, <15, <20) und wenn ich einen Wert wie 3 habe, möchte ich den Wert in meinem Ergebnis 4 mal jeweils mit dem <5 in der 'VRange'-Spalte erscheinen . Außerdem dachte ich, ich müsste meine Fälle nisten, um sie in eine einzige Spalte zu bringen? – Wep0n

+0

In diesem Fall müssen Sie Ihre Bereiche in einer Unterabfrage definieren und dann Ihre Tabelle mit diesen Bereichen verbinden, was Gordon in seiner Antwort zeigt. – Boneist

Antwort

1

Sie werden diese benötigen join zu tun mit:

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

Fehlt etwas zwischen der rechten Klammer Ihrer with-as-Anweisung und der folgenden SELECT-Anweisung? Edit: Vergiss es, ich habe es. Vielen Dank, Entschuldigung für die Logik der Derp. Ich mag es, die Dinge für mich selbst viel komplizierter zu machen als manchmal. – Wep0n