2013-02-14 2 views
1
TASKS   DATE 
NOD 1 OUT  2/5/10 
NOD 1 IN  NULL 
NOD 2 OUT  2/10/10 
NOD 2 IN  2/11/10 
NOD 3 OUT  2/15/10 
NOD 3 IN  NULL 

내가해야 할 일은 가장 큰 NOD를 찾은 다음 NOD에 IN 날짜가 있으면 행에 NO NOD를 놓고 가장 큰 NOD가 OUT으로 전송되었지만 다시 수신되지 않은 경우, 그것이 발송 된 이후의 일수를 계산하십시오. 사례 문장을 중첩 시키려고 시도하고 있지만 일어나는 일은 NOD 2 OUT을보고 IN 'NO NOD'텍스트를 삽입하는 것입니다. 가장 큰 NOD를 찾는 방법을 알아낼 수 없습니다. 여기에 지금까지 무엇을 가지고 (내가 SQL에 새로운 오전, 그래서 아무것도 방법 꺼져 있으면 사과하고 내 포맷이 나쁜 알고 있지만, 내가 이런 식으로 무엇을 더 나은로가는 것을 볼 수 있습니다.) :루프와 같이 중첩 된 case 문을 사용합니까?

CASE 
      WHEN COUNT(DISTINCT DATE_NOD_TBL.COMPLETED_DATE) = '0' THEN 'No NOD Out' 
      WHEN MAX(DATE_NOD_TBL_2.COMPLETED_DATE) IS NOT NULL AND MAX(DATE_NOD_TBL_5.COMPLETED_DATE) IS NOT NULL 
      THEN (CASE 
         WHEN MAX(DATE_NOD_TBL_3.COMPLETED_DATE) IS NOT NULL AND MAX(DATE_NOD_TBL_6.COMPLETED_DATE) IS NOT NULL 
         THEN (CASE 
           WHEN MAX(DATE_NOD_TBL_4.COMPLETED_DATE) IS NOT NULL AND MAX(DATE_NOD_TBL_7.COMPLETED_DATE) IS NOT NULL 
           THEN 'No NOD Out_3' 
           ELSE TO_CHAR(TRUNC(SYSDATE - (MAX(DATE_NOD_TBL.COMPLETED_DATE)))) 
           END) 
         ELSE TO_CHAR(TRUNC(SYSDATE - (MAX(DATE_NOD_TBL.COMPLETED_DATE)))) 
         END) 
      ELSE TO_CHAR(TRUNC(SYSDATE - (MAX(DATE_NOD_TBL.COMPLETED_DATE)))) 
      END AS "Days Since Last NOD", 

DATE_NOD_TBL contains all OUT tasks 
DATE_NOD_TBL_2 is NOD 1 OUT 
DATE_NOD_TBL_3 is NOD 2 OUT 
DATE_NOD_TBL_4 is NOD 3 OUT 
DATE_NOD_TBL_5 is NOD 1 IN 
DATE_NOD_TBL_6 is NOD 2 IN 
DATE_NOD_TBL_7 is NOD 3 IN 

것은 내가 10g 오라클 SQL을 사용하고 있습니다 : 나는 등, 각 작업에 한 번 테이블 닿도록

나는 테이블을 별칭이있다.

전체 검색어 :

SELECT DSKMTB_ACTIVITY_TYPE.ACTIVITY_TYPE_LABEL  AS "Project Type", 
    MAX(DATE_ISSUED_TBL_3.ASSIGNED_STAFF_ID)     AS "Project Manager", 
    AGENCY_INTEREST_ALT.ALTERNATE_AI_ID       AS "Farm ID #", 
    MTB_PARISH_COUNTY.PARISH_OR_COUNTY_DESC    AS "County", 
    MAX(DISTINCT AGENCY_INTEREST.MASTER_AI_NAME)  AS "Operation Name", 
    MAX(DATE_RECEIVED_TBL.COMPLETED_DATE)     AS "Date Received", 
    MAX(DATE_NOD_TBL.COMPLETED_DATE)       AS "NOD Date", 
    COUNT(DISTINCT DATE_NOD_TBL.COMPLETED_DATE)   AS "# of NOD's", 

--//days since last NOD 
CASE 
    WHEN GREATEST(MAX(DATE_NOD_TBL_2.COMPLETED_DATE), 
        MAX(DATE_NOD_TBL_3.COMPLETED_DATE), 
        MAX(DATE_NOD_TBL_4.COMPLETED_DATE)) < 
     GREATEST(MAX(DATE_NOD_TBL_5.COMPLETED_DATE), 
        MAX(DATE_NOD_TBL_6.COMPLETED_DATE), 
        MAX(DATE_NOD_TBL_7.COMPLETED_DATE)) 
     THEN TO_CHAR(TRUNC(SYSDATE - (MAX(DATE_NOD_TBL.COMPLETED_DATE)))) 
    ELSE 'No NOD Out' 
END AS "Days Since Last NOD", 


    --//net time 
    CASE WHEN 
    COUNT(DISTINCT DATE_NOD_TBL.COMPLETED_DATE) = '0' 
     THEN TRUNC(MAX(SYSDATE - DATE_RECEIVED_TBL.COMPLETED_DATE)) 
    ELSE 
    TRUNC(MAX((SYSDATE - DATE_RECEIVED_TBL.COMPLETED_DATE) - 
    --//issued NOD #1/NOD #1 Information Received 
    NVL(((CASE WHEN DATE_NOD_TBL_5.STATUS_CODE IS NULL THEN SYSDATE ELSE DATE_NOD_TBL_5.COMPLETED_DATE END) - DATE_NOD_TBL_2.COMPLETED_DATE),'0') - 
    --//issued NOD #2/NOD #2 Information Received 
    NVL(((CASE WHEN DATE_NOD_TBL_6.STATUS_CODE IS NULL THEN SYSDATE ELSE DATE_NOD_TBL_6.COMPLETED_DATE END) - DATE_NOD_TBL_3.COMPLETED_DATE),'0') - 
    --//issued NOD #3/NOD #3 Information Received 
    NVL(((CASE WHEN DATE_NOD_TBL_7.STATUS_CODE IS NULL THEN SYSDATE ELSE DATE_NOD_TBL_7.COMPLETED_DATE END) - DATE_NOD_TBL_4.COMPLETED_DATE),'0') 
)) END 
    AS "Net Time", 


    TRUNC(MAX(SysDate - DATE_RECEIVED_TBL.COMPLETED_DATE)) AS "Gross Time", 
    MAX(DATE_SITEASSESSMENT_TBL.COMPLETED_DATE)    AS "Site Visit" 
FROM DSK_CENTRAL_FILE 
INNER JOIN ACTIVITY_TASK_LIST DATE_ISSUED_TBL 
ON DATE_ISSUED_TBL.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_ISSUED_TBL.INT_DOC_ID  = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_ISSUED_TBL.REFERENCE_TASK_ID = '171' 
AND DATE_ISSUED_TBL.STATUS_CODE  IS NULL 
INNER JOIN ACTIVITY_TASK_LIST DATE_ISSUED_TBL_2 
ON DATE_ISSUED_TBL_2.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_ISSUED_TBL_2.INT_DOC_ID  = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_ISSUED_TBL_2.REFERENCE_TASK_ID = '163' 
AND DATE_ISSUED_TBL_2.STATUS_CODE  IS NULL 
INNER JOIN ACTIVITY_TASK_LIST DATE_ISSUED_TBL_3 
ON DATE_ISSUED_TBL_3.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_ISSUED_TBL_3.INT_DOC_ID  = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_ISSUED_TBL_3.REFERENCE_TASK_ID = '262' 
INNER JOIN ACTIVITY_TASK_LIST DATE_RECEIVED_TBL 
ON DATE_RECEIVED_TBL.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_RECEIVED_TBL.INT_DOC_ID  = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_RECEIVED_TBL.INT_DOC_ID  = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_RECEIVED_TBL.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_RECEIVED_TBL.REFERENCE_TASK_ID = '571' 
AND DATE_RECEIVED_TBL.STATUS_CODE  = '001' 
AND DATE_RECEIVED_TBL.COMPLETED_DATE IS NOT NULL 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_NOD_TBL 
ON DATE_NOD_TBL.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_NOD_TBL.INT_DOC_ID   = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_NOD_TBL.INT_DOC_ID   = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_NOD_TBL.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_NOD_TBL.REFERENCE_TASK_ID IN ('393','394','395') 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_NOD_TBL_8 
ON DATE_NOD_TBL_8.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_NOD_TBL_8.INT_DOC_ID   = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_NOD_TBL_8.INT_DOC_ID   = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_NOD_TBL_8.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_NOD_TBL_8.REFERENCE_TASK_ID IN('602','603','608') 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_NOD_TBL_2 
ON DATE_NOD_TBL_2.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_NOD_TBL_2.INT_DOC_ID   = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_NOD_TBL_2.INT_DOC_ID   = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_NOD_TBL_2.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_NOD_TBL_2.REFERENCE_TASK_ID = '393' 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_NOD_TBL_3 
ON DATE_NOD_TBL_3.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_NOD_TBL_3.INT_DOC_ID   = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_NOD_TBL_3.INT_DOC_ID   = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_NOD_TBL_3.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_NOD_TBL_3.REFERENCE_TASK_ID = '394' 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_NOD_TBL_4 
ON DATE_NOD_TBL_4.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_NOD_TBL_4.INT_DOC_ID   = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_NOD_TBL_4.INT_DOC_ID   = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_NOD_TBL_4.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_NOD_TBL_4.REFERENCE_TASK_ID = '395' 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_NOD_TBL_5 
ON DATE_NOD_TBL_5.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_NOD_TBL_5.INT_DOC_ID   = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_NOD_TBL_5.INT_DOC_ID   = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_NOD_TBL_5.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_NOD_TBL_5.REFERENCE_TASK_ID = '603' 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_NOD_TBL_6 
ON DATE_NOD_TBL_6.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_NOD_TBL_6.INT_DOC_ID   = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_NOD_TBL_6.INT_DOC_ID   = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_NOD_TBL_6.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_NOD_TBL_6.REFERENCE_TASK_ID = '602' 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_NOD_TBL_7 
ON DATE_NOD_TBL_7.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_NOD_TBL_7.INT_DOC_ID   = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_NOD_TBL_7.INT_DOC_ID   = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_NOD_TBL_7.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_NOD_TBL_7.REFERENCE_TASK_ID = '608' 
LEFT OUTER JOIN ACTIVITY_TASK_LIST DATE_SITEASSESSMENT_TBL 
ON DATE_SITEASSESSMENT_TBL.MASTER_AI_ID  = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND DATE_SITEASSESSMENT_TBL.INT_DOC_ID  = DSK_CENTRAL_FILE.INT_DOC_ID 
AND DATE_SITEASSESSMENT_TBL.INT_DOC_ID  = DATE_ISSUED_TBL.INT_DOC_ID 
AND DATE_SITEASSESSMENT_TBL.MASTER_AI_ID  = DATE_ISSUED_TBL.MASTER_AI_ID 
AND DATE_SITEASSESSMENT_TBL.REFERENCE_TASK_ID = '201' 
INNER JOIN DSKMTB_ACTIVITY_TYPE 
ON DSKMTB_ACTIVITY_TYPE.ACTIVITY_CATEGORY_CODE = DSK_CENTRAL_FILE.ACTIVITY_CATEGORY_CODE 
AND DSKMTB_ACTIVITY_TYPE.ACTIVITY_CLASS_CODE = DSK_CENTRAL_FILE.ACTIVITY_CLASS_CODE 
AND DSKMTB_ACTIVITY_TYPE.ACTIVITY_TYPE_CODE  = DSK_CENTRAL_FILE.ACTIVITY_TYPE_CODE 
AND DSKMTB_ACTIVITY_TYPE.PROGRAM_CODE   = DSK_CENTRAL_FILE.PROGRAM_CODE 
AND DSKMTB_ACTIVITY_TYPE.PROGRAM_CODE   = 'CF' 
AND DSKMTB_ACTIVITY_TYPE.ACTIVITY_CATEGORY_CODE = 'ATH' 
LEFT OUTER JOIN AGENCY_INTEREST_ALT 
ON AGENCY_INTEREST_ALT.MASTER_AI_ID = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND AGENCY_INTEREST_ALT.END_DATE  IS NULL 
AND AGENCY_INTEREST_ALT.USER_GROUP_ID = 'CFO' 
INNER JOIN AGENCY_INTEREST 
ON AGENCY_INTEREST.MASTER_AI_ID = AGENCY_INTEREST_ALT.MASTER_AI_ID 
AND AGENCY_INTEREST.INT_DOC_ID = AGENCY_INTEREST_ALT.INT_DOC_ID 
INNER JOIN SUBJ_ITEM_LOC_GOV_WITHIN 
ON SUBJ_ITEM_LOC_GOV_WITHIN.MASTER_AI_ID = DSK_CENTRAL_FILE.MASTER_AI_ID 
AND SUBJ_ITEM_LOC_GOV_WITHIN.INT_DOC_ID = AGENCY_INTEREST_ALT.INT_DOC_ID 
INNER JOIN MTB_PARISH_COUNTY 
ON MTB_PARISH_COUNTY.PARISH_OR_COUNTY_CODE = SUBJ_ITEM_LOC_GOV_WITHIN.PARISH_OR_COUNTY_CODE 
WHERE DSK_CENTRAL_FILE.PROGRAM_CODE   = 'CF' 
AND DSK_CENTRAL_FILE.INT_DOC_ID    != 0 
AND AGENCY_INTEREST_ALT.INT_DOC_ID   = 0 
GROUP BY DSKMTB_ACTIVITY_TYPE.ACTIVITY_TYPE_LABEL, 
    AGENCY_INTEREST_ALT.ALTERNATE_AI_ID, 
    MTB_PARISH_COUNTY.PARISH_OR_COUNTY_DESC 
ORDER BY DSKMTB_ACTIVITY_TYPE.ACTIVITY_TYPE_LABEL, 
MAX(DATE_RECEIVED_TBL.COMPLETED_DATE) 
+0

나머지 쿼리 (적어도 조인 및 그룹 기준)를 포함 할 수 있습니까? –

+0

나는 쿼리를 추가했다. 그것은 꽤 짐승이다. – user1983682

+0

무슨 뜻인지 알 겠어! –

답변

0

최대 규모의 OUT 날짜가 날짜에서 가장 큰 비교하려면, 시도 :

CASE 
    WHEN GREATEST(MAX(DATE_NOD_TBL_2.COMPLETED_DATE), 
        MAX(DATE_NOD_TBL_3.COMPLETED_DATE), 
        MAX(DATE_NOD_TBL_4.COMPLETED_DATE)) < 
     GREATEST(MAX(DATE_NOD_TBL_5.COMPLETED_DATE), 
        MAX(DATE_NOD_TBL_6.COMPLETED_DATE), 
        MAX(DATE_NOD_TBL_7.COMPLETED_DATE)) 
     THEN TO_CHAR(TRUNC(SYSDATE - (MAX(DATE_NOD_TBL.COMPLETED_DATE)))) 
    ELSE 'No NOD Out' 
END 

차례로 날짜의 쌍을 비교하기 위해, 시도 :

DECODE(case 
      when MAX(DATE_NOD_TBL_4.COMPLETED_DATE) is not null 
       then case when MAX(DATE_NOD_TBL_7.COMPLETED_DATE) is null then 'T' end 
      else 
       case 
        when MAX(DATE_NOD_TBL_3.COMPLETED_DATE) is not null 
         then case when MAX(DATE_NOD_TBL_6.COMPLETED_DATE) is null then 'T' end 
        else 
         case 
          when MAX(DATE_NOD_TBL_2.COMPLETED_DATE) is not null 
           then case when MAX(DATE_NOD_TBL_5.COMPLETED_DATE) is null then 'T' end 
         end 
       end 
     end, 'T',TO_CHAR(TRUNC(SYSDATE - (MAX(DATE_NOD_TBL.COMPLETED_DATE)))), 'No NOD Out') 
+0

나는 내가 그랬던 것과 똑같은 오류를 가지고 있다고 확신한다. NOD # 2가 OUT과 IN 모두이기 때문에, NOD # 3이 미해결 인 날을 계산하지 않고 거기에서 멈추고 있습니다. – user1983682

+0

실제로 NOD 2 IN은 NOD 3 OUT 이후이므로 여기에있는 결함이 있습니다. 이전 IN보다 새로운 OUT을 사용하지 않았다고 가정했습니다. –

+0

데이터가 엉망입니다. 나는이 문제를 해결하기 위해 노력하고 있습니다. 미안, 내가 그렇게 말해야 했어. – user1983682