0

建設プロジェクトの CRM では、クライアント、建築家、およびその他の請負業者はすべてアカウントとして存在します。テーブル PROJ_AC_LINK は ACCOUNT を PROJECT にリンクし、フィールド PROJ_AC_LINK.ROLE_TYPE_ID はそのリンクが表すものを指定します (たとえば、Joe Simms は役割「建築家」の下でプロジェクト 101 にリンクされています)。

CRM データベースとユーザー インターフェイスにより、ユーザーは複数のアカウントを同じロールの下のプロジェクトにリンクできます。場合によってはこれで問題ありません (プロジェクトに 2 人の建築家がいる) 場合もありますが、そうでない場合もあります (プロジェクトに対して請求する「クライアント」は 1 人だけであるべきです)。CRMを変更できません。

別のシステムからのクエリは、SITE_ADDRESS および CLIENT_ADDRESS を取得しようとし、各プロジェクトにリンクされているクライアントが 1 つだけであると想定します。次のようにクエリします (205 はロール「クライアント」のコードです)。

SELECT 
PROJECT.ADDRESS AS SITE_ADDRESS, 
ACCOUNT.ADDRESS AS CLIENT_ADDRESS
FROM PROJECT
LEFT JOIN PROJ_AC_LINK ON 
    (PROJ_AC_LINK.PROJECT_ID = PROJECT.PROJECT_ID 
    AND 
    PROJ_AC_LINK.ROLE_TYPE_ID = '205')
LEFT JOIN ACCOUNT ON PROJ_AC_LINK.ACCT_ID = ACCOUNT.ACCT_ID

プロジェクトにクライアントがリンクされていない場合でも、このクエリは SITE_ADDRESS を返しますが、CLIENT_ADDRESS には NULL を返します。これはまさに私が望んでいたことです。

そのシステムを使用している人々は、空白の顧客アドレスを取得した場合、CRM の人々に知らせることを知っています。ただし、プロジェクトに複数のクライアントがリンクしている可能性に対応する必要があります。

その役割のそのプロジェクトの PROJ_AC_LINK に複数のレコードがある場合に、CLIENT_ADDRESS が NULL (またはカスタム テキスト) を返すようにする方法はありますか。

何か案は?

4

2 に答える 2

0

これが1つの方法です:

SELECT p.ADDRESS AS SITE_ADDRESS, 
       a.ADDRESS AS CLIENT_ADDRESS
FROM PROJECT p LEFT JOIN
     (select a.PROJECT_ID, a.ADDRESS
      from ACCOUNT a join
           Proj_AC_Link pa
           on pa.Acct_id = a.Acct_Id
      where pa.ROLE_TYPE_ID = '205'
      group by ac.Project_id
      having count(*) = 1
     ) addr
     ON P.PROJECT_id = addr.project_id

これは、アカウントテーブルからシングルトンアドレスを返すだけです。

于 2012-09-11T13:51:25.060 に答える
0

group by ステートメントを実行してから、返されるレコードの数に基づいて case ステートメントを実行できます。

于 2012-09-11T13:15:08.280 に答える