2014-01-24 2 views
0

도움이 필요한 DB2 쿼리를 작성하고 있습니다. 누군가 기꺼이보고 싶다면 정말 고맙겠습니다. 두 테이블의 관리 번호 열에 DB2CUST 및 NOTIFICATION_REQUE :이 쿼리를 볼 수있는 바와 같이DB2 SQL 쿼리 지원이 필요합니다.

SELECT 
C.CONTROL_NO, 
    NR.NOTICE_CODE, 
    COALESCE(C.LNAME,'') AS LNAME, 
    COALESCE(C.FNAME,'') AS FNAME, 
CASE 
    WHEN SOC_SEC_NO IS NULL THEN '' 
     WHEN SOC_SEC_NO IS NOT NULL THEN REPLACE(SOC_SEC_NO, LEFT(SOC_SEC_NO,5) , '*****') 
    END AS SOC_SEC_NO, 
    COALESCE(C.SOC_SEC_NO, '') AS SOC_SEC_NO_FULL, 
    COALESCE(C.EMPLOYER,'') AS EMPLOYER, 
    COALESCE(C.FED_EMP_NO, '') AS FED_EMP_NO, 
    COALESCE(CAST(C.STW_DATE AS VARCHAR(10)),'') AS STW_DATE, 
    COALESCE(CAST(C.CREATE_DTE AS VARCHAR(10)),'') AS CREATE_DTE, 
    CASE WHEN C.STATUS IS NULL THEN '' 
     WHEN C.STATUS = 'CER - CERTIFIED' THEN 'CERTIFIED' 
     WHEN C.STATUS = 'DEF - DEFICIENT' THEN 'DEFICIENT' 
     WHEN C.STATUS = 'DEN - DENIED' THEN 'DENIED' 
     WHEN C.STATUS = 'D90 - DENIED(OVER 90 DAYS OLD)' THEN 'DENIED(OVER 90 DAYS OLD)' 
     WHEN C.STATUS = 'EPA - POA EXPIRED' THEN 'POA EXPIRED' 
     WHEN C.STATUS = 'EXP - EXPIRED REQUEST' THEN 'EXPIRED REQUEST' 
     WHEN C.STATUS = 'MAN - MANUAL' THEN 'MANUAL' 
     WHEN C.STATUS = 'NAR - NON ACTIONABLE REQUEST' THEN 'NON ACTIONABLE REQUEST' 
     WHEN C.STATUS = 'NPA - POA NOT FOUND' THEN 'POA NOT FOUND' 
     WHEN C.STATUS = 'NPC - PENDING CERT/NO POA' THEN 'PENDING CERT/NO POA' 
     WHEN C.STATUS = 'NPD - PENDING DENY/NO POA' THEN 'PENDING DENY/NO POA' 
     WHEN C.STATUS = 'OOS - OOS VALIDATION' THEN 'OOS VALIDATION' 
     WHEN C.STATUS = 'OTG - OTHER TARGET GROUPS' THEN 'OTHER TARGET GROUPS' 
     WHEN C.STATUS = 'PEN - PENDING VALIDATION' THEN 'PENDING VALIDATION' 
     WHEN C.STATUS = 'RTV - READY TO VALIDATE' THEN 'READY TO VALIDATE' 
    END AS STATUS, 
    CASE 
    WHEN C.WOTC_AWARD_CODE IS NULL AND WTW_AWARD_CODE IS NULL THEN '' 
    WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'A ' THEN 'A - SHORT-TERM TANF RECIPIENT' 
    WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'B ' THEN 'B - VETERANS' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'BA ' THEN 'BA - QUALIFIED VET RECEIVING SNAP BENEFITS' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'BB ' THEN 'BB - DISABLED VET' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'BC ' THEN 'BC - DISABLED VET UNEMPLOYED FOR 6 MONTHS' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'BD ' THEN 'BD - VET UNEMPLOYED FOR 4 WEEKS BUT LESS THAN 6 MONTHS' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'BE ' THEN 'BE - VET UNEMPLOYED FOR 6 MONTH' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'C ' THEN 'C - EX-FELON' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'D ' THEN 'D - DESIGNATED COMMUNITY RESIDENT' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'E ' THEN 'E - VOCATIONAL REHABILITATION REFERRAL' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'F ' THEN 'F - SUMMER YOUTH' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'G ' THEN 'G - SNAP (FOOD STAMP) RECIPIENT' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'H ' THEN 'H - SUPPLEMENTAL SECURITY INCOME (SSI) RECIPIENT' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = ' I' THEN 'I - LONG-TERM TANF RECIPIENT' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'J ' THEN 'J - UNEMPLOYED VETERAN' 
     WHEN CONCAT(C.WOTC_AWARD_CODE, C.WTW_AWARD_CODE) = 'K ' THEN 'K - DISCONNECTED YOUTH' 
    END AS WOTC_AWARD_CODE, 
CASE 
    WHEN C.STATUS IN ('CER - CERTIFIED', 'DEF - DEFICIENT', 'DEN - DENIED', 'D90 - DENIED(OVER 90 DAYS OLD)', 'EXP - EXPIRED REQUEST', 'NAR - NON ACTIONABLE REQUEST') 
      THEN COALESCE(CAST(NR.NOTICE_DT AS VARCHAR(10)), '') 
     ELSE '' 
END AS NOTICE_DT 
FROM WITC00DS.DB2CUST C 
LEFT OUTER JOIN WITC00DS.NOTIFICATION_REQUE NR 
ON C.CONTROL_NO = NR.CONTROL_NBR 
WHERE 
C.AGENT_CODE = 'HR' 
AND C.STW_DATE BETWEEN '01/01/2000' AND '01/21/2014' 
AND (
    (NR.NOTICE_DT = (SELECT MAX(NOTICE_DT) FROM WITC00DS.NOTIFICATION_REQUE ZZ WHERE ZZ.CONTROL_NBR = C.CONTROL_NO AND NOTICE_CODE IN ('C', 'F', 'D', 'D2', 'XP', 'S', 'VR')) 
     OR (NR.NOTICE_DT IS NULL)) 
) 
AND 
    ((NOTICE_CODE IN ('C', 'F', 'D', 'D2', 'XP', 'S', 'VR') 
    ) OR (NR.NOTICE_DT IS NULL)) 
ORDER BY Control_No 

기본적으로 왼쪽 외부는 두 테이블 사이의 조인 않습니다

아래의 쿼리는 내가 지금까지있는 것입니다.

이 검색어는 내가 필요로하는 것에 매우 가깝지만 제한된 수의 경우에 최대 통보 날짜가 동일한 결과에 중복 된 대조 번호 레코드가 생깁니다. 통지 날짜가 같은 몇 가지 경우에 I는 다음 기준에 맞는 하나를 선택해야합니다

  1. DB2CUST의 상태 = '결핍'의 경우와 notice_code를 = 'F'는 선택 기록
  2. DB2CUST의 상태가 = '거부'와 notice_code은 = 가 'D'를 기록하는
  3. DB2CUST의 상태가 = '인증'경우
  4. 및 notice_code = 'C'를 선택하면 그 기록 등

그래서를 선택 , 아주 적은 ca에서 중복 된 최대 통고 날짜가있는 곳 ses 위에 표시된 상태와주의 코드의 올바른 조합에 따라 두 개의 레코드 중 하나를 선택해야합니다. 누군가 내가이 일을해야하는 쿼리를 향상시킬 수 있습니까?

감사합니다,

피트

답변

1

당신은 row_number()를 사용하여 원하는 것을 얻을 수 있습니다. 다음은 할 수있는 일의 예입니다.

with cte (<your query here>) 
select cte.* 
from (select cte.*, 
      row_number() over (partition by CONTROL_NO order by 
           (case when DB2CUST.status = 'Deficient' and notice_code = 'F' then 1 
             when DB2CUST.status = 'Denied' and notice_code = 'D' then 2 
             when DB2CUST.status = 'Certified' and notice_code = 'C' then 3 
             . . . 
           end) 
           ) as seqnum 

     from cte 
    ) t 
where seqnum = 1; 
0

감사합니다. 정말 감사. 나는 달릴 수 있었지만 약간의 사소한 변화를 만들어야했다. 또한

WITH CTE AS 
(<My Query>) 
    SELECT * FROM 
    (
    SELECT CTE.*, ROW_NUMBER() OVER 
    (
     PARTITION BY CONTROL_NO ORDER BY 
     (
     CASE 
      WHEN STATUS = 'Deficient' AND NOTICE_CODE = 'F' THEN 1 
      WHEN STATUS = 'Denied' AND NOTICE_CODE = 'D' THEN 2 
      WHEN STATUS = 'Certified' AND NOTICE_CODE = 'C' THEN 3 
     END 
    ) 
    ) AS SEQNUM 
    FROM CTE 
) T 
WHERE SEQNUM = 1 

, 내가 Control_No에 의해 하행 결과를 정렬 할 수 있습니다 궁금 해서요 : 최종 결과는 다음과 같습니다? 도와 줘서 고마워.

피트