ABOUT ME

-

Today
-
Yesterday
-
Total
-

  • [오라클(ORACLE)/SQL] WHERE IN, CASE WHEN THEN END, GROUP BY, DISTINCT, MAX 쿼리문
    개발자 레퍼런스 2009. 4. 23. 00:10
    반응형
    업무중 오라클(Oracle) 혹은 MySQL의 SQL 쿼리를 정리하며 공부하는 과정에서 얻은 유용한 쿼리문을 함께 공유하기 위해 남깁니다.

    - WHERE A IN ( B, C ,D, E )
    WHERE절의 다건 조건이라고 생각하시면 됩니다. A가 B 이거나 C 이거나 D 이거나 E 중 하나라도 같은것이 있다면 출력됩니다.
    WHERE (A = B) OR (A = C) OR (A = D) OR ( A = E ) 와 같은 의미 입니다.

    -  CASE WHEN (조건1) THEN (결과1) END
       CASE WHEN (조건2) THEN (결과2) END
       CASE WHEN (조건3) THEN (결과3) END
       .............
    CASE WHEN 문은 각각의 케이스 마다 조건이 일치한다면 결과로 분기 할 수 있습니다.
    C의 CASE문이나 IF문과 활용법이 동일하다고 생각하심 이해하기 쉽습니다.

    - GROUP BY, DISTINCT, MAX
    DISTINCT는 중복된 데이타를 없애주는데 사용 합니다.
    컬럼이 하나일경우 GROUP BY로 대체하여 동일한 효과를 낼 수 있습니다.
    프로먼스적 측면에서 본다면 가급적 DISTINCT는 자제하는 것이 좋으면 가능하다면 GROUP BY로 대체해서 사용하는 것이 좋습니다.

    GROUP BY는 해당 컬럼을 그룹화하며 묶는 역할을 수행합니다.
    만약 중복을 제거하면서 다건을 단건으로 만들고 싶다면 GROUP BY를 하는 컬럼외 다른 컬럼들은 그 자체가 단건이어야 원하는 결과를 얻을 수 있습니다.

    MAX는 해당 컬럼의 최대값을 가져와 줍니다. 당연히 단건이 되겠죠.
    반대로는 최소값을 가져오는 MIN이 있습니다.

    SELECT
    A,
    MAX(B) AS B
    MAX(C) AS C
    WHERE A = "N10001"
    GROUP BY A
    이런식으로 사용되어야 A가 "N10001"인 값들의 중복을 제거한뒤 A값을 중심으로 그룹화하여 단건으로 결과값을 얻을 수 있습니다. 이때 B와 C는 해당 테이블에서의 최대값 한개만 들어 있으므로 단건이 됩니다.

    **  WHERE IN, CASE WHEN THEN END, GROUP BY, DISTINCT, MAX  쿼리 예제 **

    SELECT /*+TB_CS_JH_CM_CARDSVC_VS005*/ *
    FROM (

        SELECT
             a.tup_c
            ,b.tup_cnm
            ,b.tup_c_img_pathnm
            ,b.cd_pscrp_c
            ,d.istt_isu_yn
            ,d.rlth_isu_x_yn
            ,d.anw_isu_ed_dt
            ,b.wrs_strt_dt
            ,b.wrs_ed_dt
            ,d.naf_cdisu_yn
            ,d.acocd_isu_yn
            ,d.msf_cdisu_yn
            ,d.fam_cdisu_yn
            ,d.dgn_cdisu_yn
            ,d.cuse_cdisu_yn
           
            ,e.ccd_bran_c_1
            ,e.ccd_bran_c_2
            ,e.ccd_bran_c_3
            ,e.ccd_bran_c_4
            ,e.ccd_bran_c_5
            ,e.cd_grdc_1
            ,e.cd_grdc_2
            ,e.cd_grdc_3
            ,e.cd_grdc_4
            ,e.cd_grdc_5
            ,e.cd_grdc_6
            ,e.cd_grdc_7
            ,e.cd_grdc_8
           
        FROM (
                SELECT DISTINCT(b.tup_c)
                FROM tb_cs_jh_cm_cardsvc a
                    ,tb_cs_jh_ch_tupcodesvc b
                    ,tb_cs_jh_cm_tupbsc c
               WHERE a.svc_bzcc IN ( '00'         -- 서비스 업종코드 '전가맹점' 은 항상 조회
                                              ,:io_oiling2    -- 주유 
                                              ,:io_movie2    --영화
                                     ,:io_golf2     --골프
                                     ,:io_traveler2    --통신
                                     ,:io_communication2--서적/문구
                                     ,:io_book2    --외식/커피
                                     ,:io_coffee2    --놀이공원/휴양시설
                                     ,:io_park2     --숙박/여행
                                     ,:io_rest2     --교통/항공
                                     ,:io_traffic2    --농협판매장
                                     ,:io_aviation2   --쇼핑
                                     ,:io_shopping2   --교육/의료
                                     ,:io_education2   --스포츠/공연
                                               ,:io_medical2   --자동차
                                               ,:io_sports2    --교육수강
                                              ,:io_lodging2    --금융수수료
                                   )
                AND :apl_st_dt  BETWEEN a.apl_st_dt AND a.apl_ed_dt
                -- 제휴코드서비스내역        조건 체크
                AND a.cd_svc_c = b.cd_svc_c
                AND :apl_st_dt BETWEEN b.apl_st_dt AND b.apl_ed_dt
                -- 제휴기본                  조건 체크
                AND b.tup_c = c.tup_c
                AND c.cd_pscrp_c = :cd_pscrp_c
                AND c.cd_lclc BETWEEN :io_cd_lclc_from AND :io_cd_lclc_to
                ) a
               
                ,tb_cs_jh_cm_tupbsc b    -- 제휴기본
               
                ,(
                  SELECT tup_c
                        ,MAX(apl_st_dt) apl_st_dt
                 FROM tb_cs_is_cm_nhcrdissbas
                 WHERE tup_c >= :tup_c
                 GROUP BY tup_c
                 ) c
                
                ,tb_cs_is_cm_nhcrdissbas d -- NHBC제휴기본
               
                ,(
                 SELECT 
                     tup_c
                    ,MAX(ccd_bran_c_1) AS ccd_bran_c_1
                    ,MAX(ccd_bran_c_2) AS ccd_bran_c_2
          ,MAX(ccd_bran_c_3) AS ccd_bran_c_3
                    ,MAX(ccd_bran_c_4) AS ccd_bran_c_4
                    ,MAX(ccd_bran_c_5) AS ccd_bran_c_5
                    ,MAX(cd_grdc_1) AS cd_grdc_1
                    ,MAX(cd_grdc_2) AS cd_grdc_2
                    ,MAX(cd_grdc_3) AS cd_grdc_3
                    ,MAX(cd_grdc_4) AS cd_grdc_4
                    ,MAX(cd_grdc_5) AS cd_grdc_5
                    ,MAX(cd_grdc_6) AS cd_grdc_6
                    ,MAX(cd_grdc_7) AS cd_grdc_7
                    ,MAX(cd_grdc_8) AS cd_grdc_8
          FROM (
                   SELECT
                           tup_c
                          , case when ccd_bran_c = '1'  then '1'   end   AS ccd_bran_c_1
                          , case when ccd_bran_c = '2'  then '1'   end   AS ccd_bran_c_2
                          , case when ccd_bran_c = '3'  then '1'   end   AS ccd_bran_c_3
                          , case when ccd_bran_c = '4'  then '1'   end   AS ccd_bran_c_4
                          , case when ccd_bran_c = '7'  then '1'   end   AS ccd_bran_c_5
                          , case when cd_grdc      = '1'  then '1'   end   AS cd_grdc_1
                          , case when cd_grdc      = '2'  then '1'   end   AS cd_grdc_2
                          , case when cd_grdc      = '3'  then '1'   end   AS cd_grdc_3
                          , case when cd_grdc      = '4'  then '1'   end   AS cd_grdc_4
                          , case when cd_grdc      = '5'  then '1'   end   AS cd_grdc_5
                          , case when cd_grdc      = '6'  then '1'   end   AS cd_grdc_6
                          , case when cd_grdc      = '7'  then '1'   end   AS cd_grdc_7
                          , case when cd_grdc      = '8'  then '1'   end   AS cd_grdc_8
                    FROM tb_cs_is_cm_nhcrdissbas
                    WHERE tup_c >= :tup_c
                    )
                    GROUP BY tup_c  
          
                ) e
               
        WHERE a.tup_c >= :tup_c
      
             AND a.tup_c = b.tup_c
             AND a.tup_c = c.tup_c
             AND c.tup_c = d.tup_c
             AND d.tup_c = e.tup_c

         
             AND c.apl_st_dt = d.apl_st_dt
        
         GROUP BY a.tup_c, b.tup_cnm, b.tup_c_img_pathnm, b.cd_pscrp_c, d.istt_isu_yn, d.rlth_isu_x_yn, d.anw_isu_ed_dt, b.wrs_strt_dt, b.wrs_ed_dt, d.naf_cdisu_yn, d.acocd_isu_yn, d.msf_cdisu_yn, d.fam_cdisu_yn, d.dgn_cdisu_yn, d.cuse_cdisu_yn, e.ccd_bran_c_1, e.ccd_bran_c_2, e.ccd_bran_c_3, e.ccd_bran_c_4, e.ccd_bran_c_5, e.cd_grdc_1, e.cd_grdc_2, e.cd_grdc_3, e.cd_grdc_4, e.cd_grdc_5, e.cd_grdc_6, e.cd_grdc_7, e.cd_grdc_8
         
        ORDER BY a.tup_c

    )
    WHERE ROWNUM <= 16


    예제의 쿼리는 꽤 길지만 실무에서 사용하는 하나의 다건조회 쿼리 입니다.

    천천히 보시면 여러가지 문법이 포함되어 있으므로 초보님들이 SQL문을 익히는데 도움이 될 자료로 가치가 있을 것이라 생각됩니다.

    혹시 잘 이해가 가지 않는 부분이 있다면 덧글로 질문을 남기시면 성의껏 답변해 드리겠습니다.

    잘 익히셔서 유용하게 활용하세요. ^^
    반응형

    댓글

Designed by Tistory.