0

1 年間の各週にオープンになったクライアント ケースを特定するレポートを作成しようとしています。現在、次の SQL を使用して、カレンダーの第 1 週にケースがオープンであったかどうかを示すインジケーターをすべてのクライアントに返します。クライアントには、ケースがオープンかどうかを識別する 2 つの側面があります。MOV_START_DATE と ESU_START DATE は、期間の終了日より後である必要があり、MOV_END_DATE/ESU_START DATE は null または期間の開始日より後である必要があります。

以下のコードは機能しますが、左結合 WK1 をコピーして名前を WK2 に変更して 2 週目の情報を返すことができると思っていましたが、あいまいな名前の列に関連するエラーが発生しています。さらに、レポートに 52 個 (各週に 1 個) のジョインを残すことは特にお勧めできないと思います。

    SELECT
A.ESU_PER_GRO_ID,
A.ESU_ID,
A.STATUS,
B.MOV_ID,
B.MOV_START_DATE,
B.MOV_END_DATE,
A.ESU_START_DATE,
A.ESU_END_DATE,
LS.CLS_DESC,
nvl2(wk1.PRD_PERIOD_NUM,'Y','N') as "Week1"

FROM
A

LEFT JOIN B ON B.MOV_PER_GRO_ID = A.ESU_PER_GRO_ID

LEFT JOIN LS ON LS.CLS_CODE = A.STATUS

LEFT JOIN O_PERIODS WK1 ON B.MOV_START_DATE < WK1.PRD_END_DATE
AND (B.MOV_END_DATE IS NULL OR B.MOV_END_DATE > WK1.PRD_START_DATE)
AND A.ESU_START_DATE  < WK1.PRD_END_DATE
AND (A.ESU_END_DATE IS NULL OR A.ESU_END_DATE > WK1.PRD_START_DATE)
AND PRD_CAL_ID = 'E1190' AND WK1.PRD_PERIOD_NUM = 1 AND WK1.PRD_YEAR = 2012

WHERE
B.MOV_START_DATE  Is Not Null  
AND A.STATUS <> ('X') 

十分な情報を提供できれば幸いですが、そうでない場合は、喜んで質問にお答えします。ありがとう!

サンプル データ (上記のクエリで生成)

 P ID    ESU_ID STATUS  MOV_ID  M_START     M_END   DESC    Week1
 1      ESU1       New      1M  01/01/2012           Boo    Y
 2      ESU2       New     2M   01/03/2012           Boo    N

望ましいアウトプット (第 1 週 - 第 52 週)

 P ID    ESU_ID STATUS  MOV_ID  M_START     M_END   DESC    Week1 Week2
 1      ESU1       New     1M   01/01/2012           Boo    Y     Y
 2      ESU2       New     2M   01/03/2012           Boo    N     N
4

1 に答える 1

2

WK1 のような WK2 結合の作成が機能しなかった理由は、列 PRD_CAL_ID にテーブル エイリアスが含まれていなかったためだと思われます。ただし、ご想像のとおり、52 個の結合はおそらくあまりうまく機能しません。次のことを試してください。

SELECT A.ESU_PER_GRO_ID,    
       A.ESU_ID,    
       A.STATUS,    
       B.MOV_ID,    
       B.MOV_START_DATE,    
       B.MOV_END_DATE,    
       A.ESU_START_DATE,    
       A.ESU_END_DATE,    
       LS.CLS_DESC,    
       'Week' || TRIM(TO_CHAR(pd.PRD_PERIOD_NUM)) WEEK_DESC
  FROM A
  LEFT JOIN B
    ON B.MOV_PER_GRO_ID = A.ESU_PER_GRO_ID    
  LEFT JOIN LS
    ON LS.CLS_CODE = A.STATUS    
  LEFT JOIN O_PERIODS pd
    ON B.MOV_START_DATE < pd.PRD_END_DATE AND
       (B.MOV_END_DATE IS NULL OR
        B.MOV_END_DATE > pd.PRD_START_DATE) AND
       A.ESU_START_DATE  < pd.PRD_END_DATE AND
       (A.ESU_END_DATE IS NULL OR
        A.ESU_END_DATE > pd.PRD_START_DATE)
WHERE B.MOV_START_DATE Is Not Null AND
      A.STATUS <> ('X') AND
      pd.PRD_CAL_ID = 'E1190' AND
      pd.PRD_YEAR = 2012
ORDER BY WEEK_DESC

これにより、元のクエリとはわずかに異なる結果が生成され、週ごとに 1 つずつ、52 の異なる列を作成しようとする代わりに WEEK_DESC が作成されますが、パフォーマンスは向上すると思います。

共有してお楽しみください。

于 2012-07-04T14:52:39.940 に答える