2015-10-20 99 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声明

相关问题