2017-02-01 55 views
0

我有一個值表,我需要寫觸及2列的case語句:下面是例子SQL案例2列

Type State Min Max Value 
    A TX  2 15 100 
    A TX  16 30 200 
    A TX  31+  500 

讓說我有另一個表具有以下

Type State Weight Value 
A TX 14  ? 

所以,當我加入了表,我需要一個case語句,着眼於體重從表2,類型和狀態 - 它比較表1,知道的重量從第1行2和15之間下降,更新表2中的數值100

這可行嗎?

感謝

+1

CASE當t2.Weight BETWEEN t1.Min AND t1.Max THEN t1.VALUE ELSE無論END – Snowlockk

+0

考慮到沒有'31 +',而是使用巨大的數字作爲'Max'值。這將使總是進行數字比較更容易;建議的大多數解決方案似乎都是這樣做的。 – johnjps111

回答

0

考慮到第一表格MinMaxInteger類型的

您需要在範圍

SELECT * 
FROM another_table a 
     JOIN first_table b 
     ON a.type = b.type 
     AND a.State = b.State 
     AND a.Weight BETWEEN b.min AND b.max 
0

如果沒有行在它返回0使用INNER JOIN這個值的範圍。

select Type, State, Weight, 
     (select coalesce(Value, 0) 
     from table_b 
     where table_b.Type = table_a.Type 
       and table_b.State = table_a.State 
       and table_a.Value between table_b.Min and table_b.Max) as Value 
from table_a 
0

對於Alteryx解決方案:(1)將兩個表都加入Join工具,加入Type和State; (2)將輸出發送到一個篩選器工具,您可以在其中強制權重在最小值和最大值之間; (3)將該輸出發送到選擇工具,在該工具中只抓取所需的特定列; (因爲Join會給你所有表中的所有列)。完成。

注意事項:從Join到Filter的數據運行可能很大,因爲您要將Lookup表中的每個Type/State組合加入到另一個表中。根據數據集的大小,這可能很麻煩。雖然Alteryx速度非常快,至少我們限制了State和Type,所以如果你的數據集不是太大,這個簡單的解決方案就可以正常工作。

如果數據量較大,請嘗試將其作爲原始選擇的一部分,利用此處爲您的SQL查詢提供的其他解決方案之一。