2012-06-27 159 views
0

专业表有很多列FIRST_NAME,MIDDLE_NAME,姓氏,TITLE_CODE,COMMUNICATION_TYPE_CODE,COMMUNICATION_VALUESQL SELECT从一列和输出SQL重复值的多个列

PROFESSIONAL Table 


COMMUNICATION_TYPE_CODE column     
Telephone                
Telephone                
Fax              
Fax             
E-mail             
E-mail             
Cellular            
Cellular            

COMMUNICATION_VALUE column 
224-256-5689 
547-568-5642 
254-565-4526 
524-465-6542 
[email protected] 
[email protected] 
562-564-7854 
654-452-6897 

这仅仅是一个样品。有500,00记录,像这样COMMUNICATION_TYPE_CODE和COMMUNICATION_VALUE列

Telephone = PHONE1 
Cellular = PHONE2 
E-mail = EMAIL1 
Fax = FAX1 



SELECT 'IMD Data Source' as DATA_SOURCE, 
FIRST_NAME as FIRST_NM, 
MIDDLE_NAME as MIDDLE_NM, 
LAST_NAME as LAST_NM, 
TITLE_CODE as CREDENTIALS, 
PHONE1, 
PHONE2, 
EMAIL1, 
FAX1, 
FROM DLA_PROFESSIONAL_A 

I already mapped the FIRST_NAME,MIDDLE_NAME, LAST_NAME, TITLE_CODE to target columns in my select statement so dont worry about that. I am having problems mapping PHONE1,PHONE2,EMAIL1,FAX1 

我要挑出来的通信值列数据(电话号码,电子邮件,传真,蜂窝)当交际类型代码是(电话,传真,电子邮件,蜂窝)

这具有去4个独立COLUMNS(当COMMUNICATION_TYPE_CODE =“电话”我需要从柱拉COMMUNICATION_VALUE数据和其映射到 PHONE1列输出,当COMMUNICATION_TYPE_CODE ='蜂窝'我需要从列中提取COMMUNICATION_VALUE数据,并将其映射到 PHONE2列的输出中,当COMMUNICATION_TYPE_CODE ='电子邮件'我需要从柱拉COMMUNICATION_VALUE数据和其映射到在输出 EMAIL1柱,当COMMUNICATION_TYPE_CODE =“传真”我需要从柱拉COMMUNICATION_VALUE数据和其映射到在输出 EMAIL1列)

I have the separate sequels I dont know how to put it in to the original select statement. 




SELECT DISTINCT COMMUNICATION_VALUE FROM DG_SP_NP.DLA_PROFESSIONAL_A WHERE COMMUNICATION_TYPE_CODE='Telephone' 

SELECT DISTINCT COMMUNICATION_VALUE FROM DG_SP_NP.DLA_PROFESSIONAL_A WHERE COMMUNICATION_TYPE_CODE='Cellular' 

SELECT DISTINCT COMMUNICATION_VALUE FROM DG_SP_NP.DLA_PROFESSIONAL_A WHERE COMMUNICATION_TYPE_CODE='E-mail' 

SELECT DISTINCT COMMUNICATION_VALUE FROM DG_SP_NP.DLA_PROFESSIONAL_A WHERE COMMUNICATION_TYPE_CODE='Fax' 

我想要做这样的事情。这不是4个输出的正确的sql,但你明白了。

SELECT 'IMD Data Source' DATA_SOURCE, 
FIRST_NAME as FIRST_NM, 
MIDDLE_NAME as MIDDLE_NM, 
LAST_NAME as LAST_NM, 
TITLE_CODE as CREDENTIALS, 
SELECT DISTINCT COMMUNICATION_VALUE FROM PROFESSIONAL WHERE COMMUNICATION_TYPE_CODE='Telephone' as PHONE1, 
SELECT DISTINCT COMMUNICATION_VALUE FROM PROFESSIONAL WHERE COMMUNICATION_TYPE_CODE='Cellular' as PHONE2, 
SELECT DISTINCT COMMUNICATION_VALUE FROM PROFESSIONAL WHERE COMMUNICATION_TYPE_CODE='E-mail' as EMAIL1, 
SELECT DISTINCT COMMUNICATION_VALUE FROM PROFESSIONAL WHERE COMMUNICATION_TYPE_CODE='Fax' as FAX1, 
FROM PROFESSIONAL 

所有数据都在一个表(专业人士)

+0

您能向我们展示实际的CREATE TABLE语句来澄清表结构吗? – bluevector

+0

忘了其他一切。只需要担心 COMMUNICATION_TYPE_CODE和COMMUNICATION_VALUE列......我已经将FIRST_NAME,MIDDLE_NAME,LAST_NAME,TITLE_CODE映射到我的select语句中的目标列,所以不用担心这一点。我有问题映射电话1,电话2,电子邮件1,传真1 – oracledba

+0

此外,您可以告诉我们你期望输出的样子。 –

回答

1

你在做什么是相当复杂的。您正尝试单独订购联系信息。 SQL并不完全支持这一点。

相反,您需要添加一个“行号”列,在下面的代码中称为seqnum。该查询使用此信息将联系信息组合到适当的行上。我发现联合和组合方法更容易(替代方法是全外连接)。

select p.<whatever>, phone1, phone2, EmailContacts, fax 
from Professional p left outer join 
    (select ProfessionalId, seqnum, 
      MAX(Phone1) as Phone1, MAX(Phone2) as Phone2, MAX(Email) as Email, MAX(Fax) as fax 
     from ((select ProfessionalId, COMMUNICATION_VALUE as Phone1, 
        NULL as Phone2, NULL as Email, NULL as Fax 
        row_number() over (partition by ProfessionalId order by ProfessionalId) as seqnum 
      from (select distinct ProfessionalId, COMMUNICATION_VALUE, 
        from Professional p 
        where COMMUNICATION_TYPE_CODE = 'Telephone' 
       ) 
      ) union all 
      (select ProfessionalId, NULL, COMMUNICATION_VALUE, NULL, NULL 
        row_number() over (partition by ProfessionalId order by ProfessionalId) as seqnum 
      from (select distinct ProfessionalId, COMMUNICATION_VALUE, 
        from Professional p 
        where COMMUNICATION_TYPE_CODE = 'Cellular' 
       ) 
      ) union all 
      (select ProfessionalId, NULL, NULL, COMMUNICATION_VALUE, NULL 
        row_number() over (partition by ProfessionalId order by ProfessionalId) as seqnum 
      from (select distinct ProfessionalId, COMMUNICATION_VALUE, 
        from Professional p 
        where COMMUNICATION_TYPE_CODE = 'E-mail' 
       ) 
      ) union all 
      (select ProfessionalId, NULL, NULL, NULL, COMMUNICATION_VALUE, 
        row_number() over (partition by ProfessionalId order by ProfessionalId) as seqnum 
      from (select distinct ProfessionalId, COMMUNICATION_VALUE, 
        from Professional p 
        where COMMUNICATION_TYPE_CODE = 'Fax' 
       ) 
      ) 
      ) 
    group by ProfessionalId, seqnum 
    ) c 
    on c.ProfessionalId = p.ProfessionalId 

此查询假定每行都有一个ProfessionalId来标识每个人。

+0

+1做得好先生 – EkoostikMartin

+0

不工作....但感谢您的帮助 – oracledba

+0

您可以详细解释这个问题吗?这可能只是代码中的一个错字。 –

0

那是不可能的。

我假设你有这样的:

JIM | SMITH | TELEPHONE | 224-256-5689 
JIM | SMITH | TELEPHONE | 547-568-5642 

一个(不同的)吉姆·史密斯一行必须如何知道哪个communication_values的返回时,有不止一个?

您可以获得> 1行,或者您需要选择TOP 1或某些其他条件来返回所需的单个值。

也许你想这样的事情作为你的嵌套查询:

(SELECT TOP 1 COMMUNICATION_VALUE FROM PROFESSIONAL P_INNER WHERE COMMUNICATION_TYPE_CODE='Telephone' AND P_INNER.<field/s> = P_OUTER.<field/s> ORDER BY <some_field>) 

编辑

的这样呢?

CASE WHEN COMMUNICATION_TYPE_CODE='Telephone' THEN COMMUNICATION_VALUE END as PHONE1, 
CASE WHEN COMMUNICATION_TYPE_CODE='Cellular' THEN COMMUNICATION_VALUE END as PHONE2, 
CASE WHEN COMMUNICATION_TYPE_CODE='E-mail' THEN COMMUNICATION_VALUE END as EMAIL1, 
CASE WHEN COMMUNICATION_TYPE_CODE='Fax' THEN COMMUNICATION_VALUE END as FAX1, 
+0

没有每一行是不同的人...吉姆史密斯第一行沙龙第二行等 – oracledba

0

关系表中的列只能包含一个值。这意味着根据您提供的模式(列名称),PROFESSIONAL表的每个条目只能有一个用于COMMUNICATION_CODE的值和一个用于COMMUNICATION_VALUE的值。在关系数据库术语中,这被称为First Normal Form

这就是说,您可以在PROFESSIONAL表中有多个条目,每个条目都具有相同的名称信息,但具有唯一的COMMUNICATION_VALUE和COMMUNICAITON_CODE数据。但是,这违反了另一个关系设计考虑,即尽量减少数据重复。

我的建议是将COMMUNICATION_VALUE和COMMUNICATION_CODE置于一个单独的表中,然后使用PROFESSIONAL表的主键作为此新通信表的辅助键,以便能够为每个条目选择所有COMMUNICATION TABLE值PROFESSIONAL表。

这有道理吗?

+0

COMMUNICATION_VALUE和COMMUNICATION_CODE位于同一个表中,我无法创建新表并将其移动。有没有什么办法可以实现我想要的逻辑而不需要创建一个新表格 – oracledba

+0

那么这意味着如果我有三个communication_values,那么我会在你的表格中出现三次?我需要对其进行测试,但是您的'SELECT DISTINCT COMMUNICATION_VALUE FROM PROFESSIONAL WHERE COMMUNICATION_TYPE_CODE ='Cellular''还需要包含'AND primary_key =''为您正在寻找的人选择'Cellular'行。 – HeatfanJohn

+0

@ Gordon-Linoff的UNION示例可能有效。 – HeatfanJohn