2015-04-06 63 views
1

以下是示例數據。Proc Sql - 來自3個表的相同列名並操作

表1:

iD Flag Reason 
1 1  ABCD 
2 0  
3 0  
4 1  ERS 
5 0  

表2:

iD Flag Reason 
1 1  ERS 
2 1  FGH 
3 1  DDD 
4 1  
5 0  

表3:

iD Flag Reason 
1 1  
2 1 DDD 
3 1  
4 1  
5 1 ERS 

我想寫一個PROC SQL,這將有助於我的不同原因的情況下分開。

proc sql; 
select case when (table1.flag = 1 and reason = 'ABCD') then 1 
     when (table2.flag = 1 and reason = 'ABCD') then 1 
     when (table3.flag = 1 and reason = 'ABCD') then 1 
     when (table1.flag = 1 and reason = 'FGH') then 2 
     when (table2.flag = 1 and reason = 'FGH') then 2 
      : 
      : 
     when (table3.flag = 1 and reason = 'ERS') then 4 
     Else 0 
     End as output 
    from table1 
    inner join table2 on table1.id = table2.id 
    inner join table3 on table1.id = table3.id 
    ; 

這裏是我試圖讓輸出,

Id Reason Output 
1 ABCD  1 
2 FGH  2 
3 DDD  3 
4 ERS  4 
5 ERS  4 

即使如此,其原因可能在不同的表更改爲相同的ID,我需要在任何表格的第一個出現的原因基於Flag變量並分配輸出。

還有其他辦法可以做同樣的事嗎?

在此先感謝。

+0

可能有更好的方法。你能更清楚地解釋邏輯嗎?例如,您所需的輸出有三列,但示例代碼只產生一列。 –

回答

2

下面的查詢生成您正在尋找的輸出:

select t1.id, 
     (case when t1.flag = 1 then t1.reason 
      when t2.flag = 1 then t2.reason 
      when t3.flag = 1 then t3.reason 
     end) as reason, 
     (case when calculated reason = 'ABCD' then 1 
      when calculated reason = 'FGH' then 2 
      when calculated reason = 'DDD' then 3 
      when calculated reason = 'FGH' then 4 
      else 0 
     end) as output 
from table1 t1 inner join 
    table2 t2 
    on t1.id = t2.id inner join 
    table3 t3 
    on t1.id = t3.id; 

注意使用calculated關鍵字。這是proc sql中的一個很好的功能,它不必使用子查詢或重複定義表達式。

+0

感謝您的回覆。有效... –

相關問題