DB/Oracle

MAX, CASE , DECODE, group by.

Edward. K 2008. 10. 28. 12:23
반응형


 ORACLE CASE [http://eknote.tistory.com/851]  에서 한단계 업그레이드된 Query 문을 공부해보자.

  LEVEL_PROGRESS
          |_  user_id              :  플레이어 ID 
          |_  part                   : 레벨명
          |_  end_date            : 레벨업을 위한 완료일 ( 해당 기간내에 미션을 클리어 해야함 )
          |_  complete_date    : 레벨 종료 여부 ( 종료일을 기록 )
  
  LEVEL_INFO
          |_  user_id              :  플레이어 ID  
          |_  level_name        : 레벨명
          |_  user_Team        : 유저가 속한 TEAM ( factory)
          |_  reg_date            :  레벨업 도전 시작일
          |_  stat                   : 현재 레벨상태 
                                           - STANDBY   : 진행 STANDBY
                                           - ONE   : 레벨 1 종료
                                           - TWO   : 레벨 2 종료
                                           - THREE  : 레벨 3 종료  ( 승인 대기 )
                                           - CL    : 레벨 완료 승인

  USER_INFO
          |_  user_id              :  플레이어 ID  
          |_ user_name          : 유저이름
          |_ team_code          : 팀코드
          |_ manager_yn        : 팀장 여부 ( Y: 팀장, N: 팀원 )


2. 다음 데이터를 가지고 있다.
    LEVEL_PROGRESS    완료되었을 경우에만 complete_date가 등록된다.
  |_ userId,   'ONE', date, date     - ONE 단계를 완료 했다.
  |_ userId,  'TWO, date,             - TWO 단계를 진행중이다.

3. 원하는 데이터는 다음과 같다.
   모든 회원들의 정보를 가져와서. 각 회원별 레벨업 상태를 보여달라.
   검색 조건은 원하는 팀만 선택하여 정보를 가져올수 있도록 한다.


4. Query

SELECT   LI.user_id userId                                 -- 이슈 ID
    , LI.level_name levelTitle                                -- 이슈 제목
    , (  SELECT  user_name
       FROM  USER_INFO
      WHERE  user_id= LI.user_id AND manager_yn='Y'
      ) teamManager                                    --  팀장명
    , TO_CHAR(LI.reg_date,'YYYY.MM.DD') registerDate                -- 레벨업 도전 시작일
    , DECODE(LI.stat,'CL','완료','THREE','레벨업 진행중','') clStatus                  -- 종료승인 여부
    , max(  DECODE(  LP.part, 'ONE'
             , TO_CHAR(LP.end_date,'YYYY.MM.DD') 
            ) 
        ) scheduleDateONE                                 -- STEP 1 완료 예정일
    , max
      (
      DECODE ( LP.part, 'ONE',
           DECODE( LP.complete_date, null,
                (
                 CASE
                   WHEN  to_char(sysdate,'YYYYMMDD') > to_char(LP.end_date,'YYYYMMDD')
                   THEN  'D'  -- 지연
                   ELSE  'I'  -- 진행중
                 END
                 ),'C'       --   레벨완료
               )
          )
      ) statusONE                                        -- STEP 1  레벨업  현황
    , max( DECODE (  LP.part, 'TWO'
             , TO_CHAR(LP.end_date,'YYYY.MM.DD')
             )
        ) scheduleDateTWO                                 -- 원STEP 2 완료 예정일
    , max
      (
      DECODE ( LP.part, 'TWO',
           DECODE( LP.complete_date, null,
                (
                 CASE
                   WHEN  to_char(sysdate,'YYYYMMDD') > to_char(LP.end_date,'YYYYMMDD')
                   THEN  'D'  -- 지연
                   ELSE  'I'  -- 진행중
                 END
                 ),'C'       --   레벨완료
               )
          )
      ) statusTWO                                        -- STEP 2 레벨업  현황
    , max( DECODE(   LP.part, 'THREE'
            , TO_CHAR(LP.end_date,'YYYY.MM.DD')
           )
        ) scheduleDateTHREE                                 -- STEP 3 완료 예정일
    , max
      (
      DECODE ( LP.part, 'THREE',
           DECODE( LP.complete_date, null,
                (
                 CASE
                   WHEN  to_char(sysdate,'YYYYMMDD') > to_char(LP.end_date,'YYYYMMDD')
                   THEN  'D' -- 지연
                   ELSE  'I'  -- 진행중
                 END
                 ),'C'       --   레벨완료
               )
          )
      )  statusTHREE                                       -- STEP 3 레벨업  현황
  FROM  LEVEL_INFO       LI
    ,LEVEL_PROGRESS  LP
WHERE  TO_CHAR(LI.reg_date,'YYYYMMDD') BETWEEN '20080101' AND '20080201'
    AND LI.stat in('STANDBY','ONE','TWO','THREE','CL')  
    AND LI.user_id = LP.user_id
    AND LI.user_Team in('','')
GROUP BY LI.user_id,LI.level_name,LI.reg_date,LI.stat
ORDER BY userId desc

  선택된 팀에 대한 회원별 레벨 현황을 보여주기 위한 쿼리가 완성되었다.
 maxGroup By에 대한 이해가 주 목적이다..

반응형