0

PROFESSIONAL 表有很多列 FIRST_NAME,MIDDLE_NAME, LAST_NAME, TITLE_CODE, COMMUNICATION_TYPE_CODE, COMMUNICATION_VALUE

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
jones@gmail.com
james@yahoo.com
562-564-7854
654-452-6897

这只是一个示例。COMMUNICATION_TYPE_CODE 和 COMMUNICATION_VALUE 列有 500,00 条这样的记录

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 个单独的列(当 COMMUNICATION_TYPE_CODE='Telephone' 我需要从列中提取 COMMUNICATION_VALUE 数据并将其映射到输出中的 PHONE1 列,当 COMMUNICATION_TYPE_CODE='Cellular' 我需要从列中提取 COMMUNICATION_VALUE 数据并映射到输出中的 PHONE2 列,当 COMMUNICATION_TYPE_CODE='E-mail' 我需要从列中提取 COMMUNICATION_VALUE 数据并将其映射到输出中的 EMAIL1 列,当 COMMUNICATION_TYPE_CODE='Fax' 我需要从列中提取 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

所有数据都在一张表中(专业)

4

3 回答 3

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,以识别每个人。

于 2012-06-27T19:02:02.320 回答
0

那是不可能的。

我假设你有类似的东西:

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

当有多个通信值时,单个(不同的)JIM SMITH 行如何知道要返回哪个通信值?

您要么获得 >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,
于 2012-06-27T18:58:51.207 回答
0

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

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

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

那有意义吗?

于 2012-06-27T19:13:39.133 回答