[英]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.