2012-07-04 14 views
0

我正在嘗試製作一份報告,用於識別在一年中每週開放的客戶案例。目前我有以下SQL,它會返回所有客戶端的指示符,說明他們的案例在我們日曆的第1週期間是否已打開。客戶有兩個方面來確定他們的案件是否開放 - 他們的MOV_START_DATE和他們的ESU_START日期應該大於該期間的結束日期,並且他們的MOV_END_DATE/ESU_START日期應該爲空或大於該期間的開始日期。識別一年中每週的未處理案例

下面的代碼有效,但我認爲我可以複製左連接WK1並將其重命名爲WK2以返回第2周的信息,但是我得到與含糊不清的命名列有關的錯誤。此外,我猜測有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, 
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 

所需的輸出(Week1 - 第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 

回答

2

我懷疑是創建一個WK2的原因加入像WK1沒工作該列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 

這將產生比原始查詢稍有不同的結果,有WEEK_DESC,而不是試圖創建52個不同的欄目,每一個星期,但我認爲這將有更好的表現。

分享和享受。

+0

謝謝你,我會盡快測試並反饋。 – bawpie

+0

@鮑勃賈維斯 - 剛測試過它,它的工作完美。性能看起來非常快,並且您剛剛幫助我用可愛的快速查詢替換了非常繁瑣的電子表格。非常感謝! – bawpie