2016-04-01 4 views
0

Table2に2列(名前、番号)、表2に4列(名前、最小値、最大値、色)があります。表1のように2つの表の列を結合します。列の値は表2の列の値に含まれます

Table1の列(数値)には、Table2(最小値と最大値)に範囲がある数値が含まれています。

私の要件は、Name列に基づいてtable1からName、Numberをtable2から選択することです。

また、Table1のNumber値がTable2のMax値よりも高い場合、同じ行の値はColor列から選択する必要があります。

**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 

NOTE ...私は上記のクエリ上の任意の混乱のために教えてください:このクエリは、タブローでカスタムSQLのためなので、CTEまたは他の事前の方法論を使用することはできません。

+0

しかし、あなたは、ロジックを簡素化することができますか?そして、SQLFIDDLEは素晴らしいでしょう。 – Strawberry

+0

右イチゴ – Aditya

答えて

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

私はあなたのためだけに質問がありますか、合体はTableauのカスタムSQLで動作するのですか、それとも他の方法を使用することができますか? 本当にありがとうございます。 – Aditya

+0

@Aditya私はどのようなtableauが分かりません。 – Strawberry

+0

COALESCEの目的は何ですか?私はgoogleを使ったが、実際の目的を達成するためには成功しなかった。 – Aditya

0

あなたの最終的な状態はかなり奇妙です。分が数以下である最後の行だけmax列を無視して、選択します:

だから45以上のものが緑色である
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

質問にエラーメッセージが表示されています。理由はTable2はtable1の単一の名前の行の3行の結果を返します。 メッセージ512、レベル16、状態1、行1 サブクエリが2つ以上の値を返しました。サブクエリが=、!=、<, <= , >、> =、またはサブクエリが式として使用されているときは、これは許可されません。 – Aditya

関連する問題