2015-10-20 122 views
0

我正在編寫sql來執行一些數據遷移和操作。我正在編寫一些從源數據映射到目標數據的複雜邏輯。基本上,來自源的兩個字段將映射到目標中的一個字段,但顯然某些字段優先。我的邏輯看起來有點像這樣:Case Statement - 每個表中的列名必須是唯一的

case 
    when d.PURPOSE_NAME = 'Downsize' and (a.DEAL_TYPE_NAME <> '30-Day Letter' and a.DEAL_TYPE_NAME <> 'ACL' and a.DEAL_TYPE_NAME <> 'Assignment') then 'Renewal' 
    when d.PURPOSE_NAME = 'Early Renewal' and (a.DEAL_TYPE_NAME <> '30-Day Letter' and a.DEAL_TYPE_NAME <> 'ACL' and a.DEAL_TYPE_NAME <> 'Assignment') then 'Renewal' 
    --- more 
end as Deal_Type__c, 
case 
    when d.PURPOSE_NAME = 'Downsize' and (a.DEAL_TYPE_NAME <> '30-Day Letter' and a.DEAL_TYPE_NAME <> 'ACL' and a.DEAL_TYPE_NAME <> 'Assignment') then 'Downsize' 
    when d.PURPOSE_NAME = 'Early Renewal' and (a.DEAL_TYPE_NAME <> '30-Day Letter' and a.DEAL_TYPE_NAME <> 'ACL' and a.DEAL_TYPE_NAME <> 'Assignment') then 'Early Renewal' 
    --- more 
end as Deal_SubType__c, 

-- these values take precedence 
case 
    when a.DEAL_TYPE_NAME = '30-Day Letter' then 'Amendment' 
    when a.DEAL_TYPE_NAME = 'ACL' then 'Amendment' 
    when a.DEAL_TYPE_NAME = 'Assignment' then 'Amendment' 
end as Deal_Type__c, 
case 
    when a.DEAL_TYPE_NAME = '30-Day Letter' then 'Option to Relet' 
    when a.DEAL_TYPE_NAME = 'ACL' then 'Termination' 
    when a.DEAL_TYPE_NAME = 'Assignment' then 'Assignment' 
end as Deal_SubType__c, 

這一邏輯對我來說很有意義,但我得到的錯誤:

Column names in each table must be unique. Column name 'Deal_Type__c' in table 'Opportunity' is specified more than once.

如何使用TSQL兩個領域在我的源數據映射到一個字段在我的目的地表中使用case聲明?

+0

所有這些案件都在SELECT子句? –

+0

讓我猜** ** SELECT ... INTO機會**? – lad2025

+0

@ lad2025 yes確切 – logeyg

回答

0

你可能使用類似(簡化演示,無需CASE):

SELECT 
    1 AS Deal_Type__c, 
    2 AS Deal_Type__c 
INTO Opportunity; 

Column names in each table must be unique. Column name 'Deal_Type__c' in table 'Opportunity' is specified more than once.

問題是與你的別名,他們必須是不同的。

更改別名distinct_names到同一行中的兩個值保存:

SELECT 
    1 AS Deal_Type__c_1, 
    2 AS Deal_Type__c_2 
INTO Opportunity; 

使用UNION ALL在不同行兩個值保存:

SELECT 
    1 AS Deal_Type__c 
INTO Opportunity 
UNION ALL 
SELECT 
    2 AS Deal_Type__c; 

還是優先考慮(你的意思是不是NULL) ???

SELECT 
    ISNULL(CASE WHEN ... END, 
      CASE WHEN ... END) AS Deal_Type__c 
INTO Opportunity; 

像:

SELECT ISNULL(case 
       when a.DEAL_TYPE_NAME = '30-Day Letter' then 'Amendment' 
       when a.DEAL_TYPE_NAME = 'ACL' then 'Amendment' 
       when a.DEAL_TYPE_NAME = 'Assignment' then 'Amendment' 
       end, 
       case 
       when d.PURPOSE_NAME = 'Downsize' and (a.DEAL_TYPE_NAME <> '30-Day Letter' and a.DEAL_TYPE_NAME <> 'ACL' and a.DEAL_TYPE_NAME <> 'Assignment') then 'Renewal' 
       when d.PURPOSE_NAME = 'Early Renewal' and (a.DEAL_TYPE_NAME <> '30-Day Letter' and a.DEAL_TYPE_NAME <> 'ACL' and a.DEAL_TYPE_NAME <> 'Assignment') then 'Renewal' 
       --- more 
      end) AS Deal_Type__c 
    -- same for Deal_SubType__C 
INTO Opportunity; 

編輯:

使用哈勃的建議,你可以結合你的這兩種情況下:

SELECT case 
     when a.DEAL_TYPE_NAME = '30-Day Letter' then 'Amendment' 
     when a.DEAL_TYPE_NAME = 'ACL' then 'Amendment' 
     when a.DEAL_TYPE_NAME = 'Assignment' then 'Amendment' 
     when d.PURPOSE_NAME = 'Downsize' and (a.DEAL_TYPE_NAME <> '30-Day Letter' and a.DEAL_TYPE_NAME <> 'ACL' and a.DEAL_TYPE_NAME <> 'Assignment') then 'Renewal' 
     when d.PURPOSE_NAME = 'Early Renewal' and (a.DEAL_TYPE_NAME <> '30-Day Letter' and a.DEAL_TYPE_NAME <> 'ACL' and a.DEAL_TYPE_NAME <> 'Assignment') then 'Renewal' 
     --- more 
     end AS Deal_Type__c 
     -- same for Deal_SubType__C 
INTO Opportunity; 
+0

由於這些案例是按順序評估的,結果都是靜態字符串,而不是列值,所以很少可能出現NULL。'when'子句可以全部組合成一個'case'優先順序。 – HABO

+0

@HABO好點 – lad2025

0

的錯誤是因爲第一和第三案例的列名稱爲「Deal_Type__c」,與第二個a相同與「Deal_SubType__c」排名第四。

如果您需要兩個(或更多)組數據會需要同一列,例如,一個UNION聲明

相關問題