1

適切な管理者名 (point_of_contact、admin) を抽出するための where 句フィルターのみが異なる 2 つの同様の SQL クエリがあります。フィルター処理された両方のクエリの結果を組み合わせた結果を生成する必要がありますが、それに取り組む方法がわかりませんでした。列は、連絡先と管理者を除いて同じです。admin と point_of_contact を異なる列に配置する必要があります。連絡先または管理者のいずれかが存在しますが、どちらかが null のままになるわけではありません。私は再帰的なSQLとケースステートメントを試しましたが、私はいくつかの問題を抱えています。クエリを以下の 2 つの単純なクエリに分けました。(DB2 - バージョンがわからない)

SELECT  
                DP.DIM_PROJECT_ID, 
                DP.PROJECT_NAME, 
                DP.POINT_OF_CONTACT,
                DP.FIELD,
                DD.YEAR

            FROM FACT_Table FAT 
            RIGHT OUTER JOIN DIM_A AS DA on FAT.DIM_A_ID = DA.DIM_A_ID 
            INNER JOIN DIM_P DP on DA.DIM_P_ID = DP.DIM_P_ID
            INNER JOIN BRIDGE_USER BUP on BUP.BRIDGE_ID = DP.DIM_P_ID
            INNER JOIN DIM_DATE DD on DD.DATE_KEY = DA.A_START_DATE_ID
        WHERE DA.AWARD_CATEGORY <> 'N/A'   
        AND DD.YEAR = '2013'
        and (
                SELECT count(BUP_INNER.ADMIN_FLAG) FROM BRIDGE_USER BUP_INNER 
                INNER JOIN DIM_P DP_INNER on BUP_INNER.DIM_P_ID = DP_INNER.DIM_P_ID
                WHERE DP_INNER.DIM_P_ID = DP.DIM_P_ID
                    AND BUP_INNER.ADMIN_FLAG = 'Y'
                ) = 0
        GROUP BY DA.AWARD_TYPE_NAME, DA.AWARD_CATEGORY, DP.PROJECT_NAME, DP.POINT_OF_CONTACT, DD.YEAR

SELECT distinct
    DP.DIM_PROJECT_ID,
    DU.NAME_LAST CONCAT ', ' CONCAT t1.NAME_FIRST AS ADMIN,
    DP.PROJECT_NAME,
    DP.PROJECT_TITLE,
    DD.YEAR,
    DP.FIELD
FROM FACT_Table as FAT
INNER JOIN DIM_P DP ON FAT.DIM_P_ID = DP.DIM_P_ID
INNER JOIN BRIDGE_USER BUP on DP.DIM_P_ID = BUP.DIM_P_ID
INNER JOIN DIM_USER DU ON FAT.DIM_USER_ID = DU.DIM_USER_ID
INNER JOIN DIM_DATE DD on DD.DATE_KEY = DA.A_START_DATE_ID
INNER JOIN DIM_A DA ON FAT.DIM_A_ID = DA.DIM_A_ID

WHERE BUP.ADMIN_FLAG = 'Y'
and DD.YEAR = '2013'
and DA.AWARD_CATEGORY <> 'NA'

)
GROUP BY
    DP.DIM_P_ID,
    DU.NAME_LAST CONCAT ', ' CONCAT DU.NAME_FIRST,
    DP.PROJECT_NAME,
    DP.TITLE,
    DD.YEAR,
    DP.FIELD
4

2 に答える 2

1

使用されていない場所に null の余分な列を設定する

SELECT distinct 
         DP.DIM_PROJECT_ID, 
         DP.PROJECT_NAME,
         DP.PROJECT_TITLE,
         null as admin, 
         DP.POINT_OF_CONTACT,
         DP.FIELD,
         DD.YEAR

  FROM   FACT_Table   FAT 
  RIGHT OUTER 
  JOIN   DIM_A        DA    on FAT.DIM_A_ID = DA.DIM_A_ID 
  JOIN   DIM_P        DP    on DA.DIM_P_ID = DP.DIM_P_ID
  JOIN   BRIDGE_USER  BUP   on BUP.BRIDGE_ID = DP.DIM_P_ID
            JOIN DIM_DATE     DD    on DD.DATE_KEY = DA.A_START_DATE_ID
  WHERE DA.AWARD_CATEGORY <> 'N/A'   
    and DD.YEAR = '2013'
    and NOT EXISTS (
                     SELECT *
                       FROM BRIDGE_USER  BUP_INNER 
                       JOIN DIM_P        DP_INNER
                          on DP_INNER.DIM_P_ID = BUP_INNER.DIM_P_ID
                       WHERE DP_INNER.DIM_P_ID = DP.DIM_P_ID
                         AND BUP_INNER.ADMIN_FLAG = 'Y'
                   ) 
UNION ALL

SELECT distinct
    DP.DIM_PROJECT_ID,
    DP.PROJECT_NAME,
    DP.PROJECT_TITLE,
    DU.NAME_LAST CONCAT ', ' CONCAT t1.NAME_FIRST AS ADMIN,
    null as POINT_OF_CONTACT,
    DD.YEAR,
    DP.FIELD
  FROM FACT_Table as FAT
  JOIN DIM_P         DP   ON  FAT.DIM_P_ID = DP.DIM_P_ID
  JOIN BRIDGE_USER   BUP  on  BUP.DIM_P_ID = DP.DIM_P_ID
                          and BUP.ADMIN_FLAG = 'Y'
  JOIN DIM_USER      DU   ON  FAT.DIM_USER_ID = DU.DIM_USER_ID
  JOIN DIM_DATE      DD   on  DD.DATE_KEY = DA.A_START_DATE_ID
                          and DD.YEAR = '2013'
  JOIN DIM_A         DA   ON  DA.DIM_A_ID = FAT.DIM_A_ID
                          and DA.AWARD_CATEGORY <> 'NA'

NOT EXISTS は、サブクエリを満たす行が 1 つ見つかった時点で回答を返すため、より効率的です。一方、COUNT(*) は、サブクエリを満たすすべての行を検索し続けます。

集計関数が含まれていないため、GROUP BY 句を使用して何をしようとしているのか理解できなかったため、GROUP BY 句を省略しました。

于 2013-09-03T23:27:49.830 に答える
1

両方のクエリで必要なデータが得られる場合 (??)、名前列と名前型列を持たないのはなぜですか。

最初のクエリでは、DP.POINT_OF_CONTACT を specialName として入力します。このクエリ「連絡先」に nameType として列を追加します。

2 番目のクエリで、「as ADMIN」を as specialName に変更します。nameType としてクエリ「Admin」に列を追加します。

最初のクエリに project_title を含める必要があるかもしれませんが、その後、2 つの結果セットを UNION できるはずです。その後、結果を処理する後のクエリで、nameType 列を操作できるようになります。

これはあなたが進んでいた方向ですか?そうでない場合は、質問の詳細が必要になる場合があります。最高のニック。

于 2013-09-03T19:26:06.023 に答える