SQL 좀 한번 봐주셨으면 합니다.. 0 2 2,933

by 당직하사 CONNECT BY LEVEL [2012.03.02 17:59:09]


WITH TA AS
(
SELECT 'KOO1' MBA_CD, 459 REPTDC_NO, '2009' YY FROM DUAL
UNION
SELECT 'KOF1' MBA_CD, 444 REPTDC_NO, '2009' YY FROM DUAL
UNION
SELECT 'KOF1' MBA_CD, 475 REPTDC_NO, '2010' YY FROM DUAL
)
  SELECT B.YY
   , A.MBA_CD
   , A.REPTDC_NO
    FROM TA A
   , (SELECT YY
    FROM (    SELECT 2008 + LEVEL - 1 AS YY
    FROM DUAL
  CONNECT BY LEVEL <= TO_NUMBER (TO_CHAR (SYSDATE, 'YYYY')) - 2008 + 1)) B
   WHERE A.YY(+) = B.YY
ORDER BY B.YY
   , A.MBA_CD
   , A.REPTDC_NO

실행결과를 보면
-----------------------------------------------------
YY MBA_CD REPTDC_NO
2008
2009 KOF1  444
2010 KOO1 459
2011 KOF1 475
2012
--------------------------------------------------------------

이 데이터를
아래와 같이 조회되게 할 수 있는 방법이 있을까요..
-----------------------------------------------------
YY  MBA_CD  REPTDC_NO
2008
2009  KOF1  444
2010  KOO1  459
2011  KOO1  444
2011 KOF1   475
2012 KOO1   444
2012  KOF1   475
--------------------------------------------------------------

즉 년도에 MBA_CD, REPTDC_NO 가 존재하지 않는 경우
이전 년도에 발생한 데이터중 가장 큰 값을 가져오는 sql을 작성하려 하는데 도움좀 받고 싶습니다..
ㅠㅠ
by 손님 [2012.03.05 09:49:52]
WITH ta(mba_cd, reptdc_no, yy) AS
(
SELECT 'KOF1', 444, '2009' FROM dual
UNION ALL SELECT 'KOO1', 459, '2010' FROM dual
UNION ALL SELECT 'KOF1', 475, '2011' FROM dual
)
SELECT yy
     , NVL2(reptdc_no, mba_cd, '') mba_cd
     , reptdc_no
  FROM (
        SELECT b.yy
             , a.mba_cd
             , LAST_VALUE(a.reptdc_no IGNORE NULLS)
               OVER(PARTITION BY a.mba_cd ORDER BY b.yy) reptdc_no
             , ROW_NUMBER() OVER(PARTITION BY b.yy ORDER BY a.yy) rn
          FROM (SELECT 2008 + LEVEL - 1 yy
                  FROM dual
                 CONNECT BY LEVEL <= TO_CHAR(sysdate, 'yyyy') - 2008 + 1
                ) b
          LEFT OUTER JOIN ta a
          PARTITION BY (a.mba_cd)
            ON a.yy = b.yy
        )
 WHERE reptdc_no IS NOT NULL
    OR rn = 1
 ORDER BY yy, mba_cd
;

by 당직하사 [2012.03.05 13:25:46]

답변 감사드립니다..

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입