2012-06-27 70 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