2016-04-01 6 views
0

Ich habe 2 Spalte (Name, Nummer) in Tabelle1 und 4 Spalte (Name, Min, Max, Farbe) in Tabelle2.Kombinieren Sie zwei Tabellenspalten gemäß Tabelle1 Spaltenwert fällt in Tabelle 2 Spaltenwert

Die Spalte "Tabelle1" (Nummer) enthält einen numerischen Wert, für den in Tabelle 2 ein Bereich vorhanden ist (Min und Max).

Meine Anforderung ist, Name, Nummer aus Tabelle1 und Farbe aus Tabelle2 auf der Grundlage der Spalte Name auszuwählen.

Wenn der Zahlenwert in Tabelle1 höher ist als der Höchstwert von Tabelle2, muss der gleiche Zeilenwert aus der Spalte Farbe ausgewählt werden.

**Table1 sample data:** 

**Name Number** 
A  33 
B  17 


**Table2 sample data:** 

**Name Min Max Color** 
A  0  20  RED 
A  21 44  Yellow 
A  45 45  Green 
B  0  0.9 Green 
B  1  15.99 Yellow 
B  16 16  RED 

**Output** 

**Name Number Color** 
A  33  Yellow 
B  17  Red 

Bitte mich für jede Verwirrung über Abfragen wissen lassen ...

Hinweis: Diese Abfrage ist für benutzerdefinierten SQL in Tableau, so kann nicht verwendet werden CTE oder auch vorab Methodik.

+0

So etwas mehr als 45 ist grün? Und ein SQLFIDDLE wäre nett. – Strawberry

+0

Right Erdbeere – Aditya

Antwort

0
SELECT x.* 
    , COALESCE(y.color,z.color) color 
    FROM table1 x 
    LEFT 
    JOIN table2 y 
    ON y.name = x.name 
    AND x.number BETWEEN y.min AND y.max 
    JOIN 
    (SELECT a.* 
     FROM table2 a 
     JOIN 
      (SELECT name,MAX(max) max FROM table2 GROUP BY name) b 
      ON b.name = a.name 
      AND b.max = a.max 
    ) z 
    ON z.name = x.name; 
+0

Ich habe nur die Frage für Sie, ist das Coalesce mit Tableau Custom SQL oder ich kann jede andere Methode verwenden? Wirklich schätzen Sie Ihre Bemühungen. – Aditya

+0

@Aditya Ich habe keine Ahnung, was Tableau ist. – Strawberry

+0

Was ist der Zweck von COALESCE ?, wie ich Google aber nicht Erfolg, um eigentlichen Zweck zu bekommen. – Aditya

0

Ihr Endzustand ist eher seltsam. Sie können jedoch die Logik vereinfachen: nur die max Spalte ignorieren und die letzte Zeile wählen, wo die min kleiner oder gleich der Anzahl ist:

select t1.*, 
     (select t2.color 
     from table2 t2 
     where t1.name = t2.name and t2.min <= t1.number 
     order by t2.min desc 
     limit 1 
     ) as color 
from table1 t1; 
+0

Ich bekomme unter Fehler msg auf Ihrer Abfrage. Grund ist Tabelle2 gibt 3 Zeilen Ergebnis für eine einzelne Namenszeile in Tabelle1 zurück. Msg 512, Ebene 16, Status 1, Zeile 1 Unterabfrage hat mehr als 1 Wert zurückgegeben. Dies ist nicht zulässig, wenn die Unterabfrage =,! =, <, <= , >,> = oder wenn die Unterabfrage als Ausdruck verwendet wird. – Aditya

Verwandte Themen