繁体   English   中英

SQL从一列中选择不同的值,然后将SQL输出到多列

[英]SQL Select Distinct Values from one Column and Output SQL to Multiple Columns

专业表有许多列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

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

您正在做的事情很复杂。 您正在尝试单独订购联系信息。 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,以标识每个人。

那不可能

我假设你有类似的东西:

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

当一个(不同的)JIM SMITH行超过一个时,如何知道该返回哪个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,

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

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

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

那有意义吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM