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

通信種別コードが(Telephone,Fax,E-mail,Cellular)の場合、通信値列のデータ(電話番号、email、fax、cellular)を取り出す必要があります。

これは 4 つの個別の列に移動する必要があります (COMMUNICATION_TYPE_CODE='Telephone' の場合、列から COMMUNICATION_VALUE データを取得し、それを出力の PHONE1 列にマップする必要があります。COMMUNICATION_TYPE_CODE='Cellular' の場合、列から COMMUNICATION_VALUE データを取得してマップする必要があります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

すべてのデータは 1 つのテーブルにあります (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

リレーショナルテーブルの列には、1つの値しか含めることができません。これは、指定したスキーマ(列名)に基づいて、PROFESSIONALテーブルの各エントリがCOMMUNICATION_CODEに1つの値、COMMUNICATION_VALUEに1つの値しか持てないことを意味します。リレーショナルデータベースの用語では、これは第一正規形と呼ばれます。

そうは言っても、PROFESSIONALテーブルに複数のエントリを含めることができます。各エントリには同じ名前情報がありますが、一意のCOMMUNICATION_VALUEおよびCOMMUNICAITON_CODEデータがあります。ただし、これは、データの重複を最小限に抑えるという別のリレーショナル設計の考慮事項に違反します。

COMMUNICATION_VALUEとCOMMUNICATION_CODEを別々のテーブルに配置し、PROFESSIONALテーブルのプライマリキーをこの新しいCOMMUNICATIONテーブルのセカンダリキーとして使用して、PROFESSIONALテーブルの各エントリのすべてのCOMMUNICATIONTABLE値を選択できるようにすることをお勧めします。

それは理にかなっていますか?

于 2012-06-27T19:13:39.133 に答える
0

それは可能ではありません。

私はあなたが次のようなものを持っていると仮定しています:

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,
于 2012-06-27T18:58:51.207 に答える