2012-06-27 2 views
0

전문 표가 많은 열 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 
[email protected] 
[email protected] 
562-564-7854 
654-452-6897 

을 하나 열 및 출력 SQL에서 고유 값에서 SQL. 내가 (전화 번호, 이메일, 팩스, 휴대 전화) COMUNICATION 타입 코드 인 경우 (전화, 팩스 통신 값 열 데이터를 선택해야

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 

500,00 COMMUNICATION_TYPE_CODE이 같은 기록, COMMUNICATION_VALUE 열이 있습니다 전자 메일, 셀룰러)이 4 별도 COLUMNS (TO 가야

때 COMMUNICATION_TYPE_CODE = '전화'I 컬럼에서 COMMUNICATION_VALUE 데이터를 가져와 출력에 PHONE1 열에 해당 매핑 할 때 COMMUNICATION_TYPE_CODE = '휴대 '열에서 COMMUNICATION_VALUE 데이터를 가져와 출력에 PHONE2 열로 매핑해야합니다. COMMUNICATION_TYPE_CODE ='E-mail '일 경우, I 열로부터 COMMUNICATION_VALUE 데이터를 가져와 COMMUNICATION_TYPE_CODE 용 = '팩스'I 컬럼에서 COMMUNICATION_VALUE 데이터를 가져와 출력 이메일 1 열)

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' 
해당 매핑 할 때 출력 이메일 1 열에 해당 매핑해야

나는 이런 식으로하고 싶다. 이것은 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 문의 목표 열에 매핑 했으므로 걱정하지 않아도됩니다. PHONE1, PHONE2, EMAIL1, FAX1을 매핑하는 데 문제가 있습니다. – 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의 알고해야합니까?

하나 이상의 행을 얻거나 필요한 단일 값을 반환하려면 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

각 행마다 다른 사람이 없습니다 ... Jim smith 첫 행 샤론 두 번째 행 등등 – oracledba

0

관계형 테이블의 열은 하나의 값만 포함 할 수 있습니다. 즉, 제공 한 스키마 (열 이름)에 따라 PROFESSIONAL 테이블의 각 항목은 COMMUNICATION_CODE에 대해 하나의 값과 COMMUNICATION_VALUE에 대해 하나의 값만 가질 수 있음을 의미합니다. 관계형 데이터베이스 용어에서 이것은 First Normal Form이라고합니다.

PROFESSIONAL 테이블에 여러 개의 항목이 있지만 이름 정보는 같지만 고유 한 COMMUNICATION_VALUE 및 COMMUNICAITON_CODE 데이터가있을 수 있습니다. 그러나 이는 데이터의 중복을 최소화하는 또 다른 관계형 설계 고려 사항을 위반합니다.

COMMUNICATION_VALUE 및 COMMUNICATION_CODE를 별도의 테이블에 놓은 다음 PROFESSIONAL 테이블의 기본 키를이 새 COMMUNICATION 테이블의 보조 키로 사용하여 각 COMMUNICATION TABLE 값을 선택할 수 있습니다. PROFESSIONAL 테이블

의미가 있습니까?

+0

COMMUNICATION_VALUE 및 COMMUNICATION_CODE는 동일한 테이블에 있으며 새 테이블을 만들고 이동할 수 없습니다. 새로운 테이블을 만들지 않고 원하는 로직을 구현할 수있는 방법이 있습니까? – oracledba

+0

그러면 세 개의 communication_values가 있으면 테이블에 세 번 나타납니다. 테스트해볼 필요가 있습니다 만, 'COMMUNICATION_TYPE_CODE ='Cellular''에서 'DISTINCT COMMUNICATION_VALUE FROM PROFESSIONAL'을 선택하려면 찾고있는 사람의 'Cellular'행을 선택하기 위해 'AND primary_key = '을 포함시켜야합니다. – HeatfanJohn

+0

@ Gordon-Linoff의 UNION 예제가 작동 할 수도 있습니다. – HeatfanJohn

관련 문제