ORACLE PIVOT관련 질문드립니다. 0 2 2,907

by KING_MIN [PL/SQL] PIVOT JOIN [2020.11.05 11:42:35]



oracle사용중입니다.
pl/sql 12 사용중입니다.


SELECT *
FROM
(
WITH MM AS(                                                           --MONTH의 가상테이블 생성 
       SELECT '01' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '02' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '03' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '04' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '05' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '06' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '07' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '08' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '09' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '10' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '11' AS CUST_MONTH FROM DUAL
       UNION
       SELECT '12' AS CUST_MONTH FROM DUAL
)
SELECT PIV.MM MM, PIV.COLVAL, SUM(CNT) CNT--, COUNT(CASE WHEN MM IS NULL THEN 1 ELSE NULL END) NULLCNT  --LEFT JOIN한 테이블중에서 PIV.MM, PIV.COLVAL, PIV.CNT DATA선택 
FROM MM LEFT JOIN (                                                                  --가상테이블 MONTH를 기준으로 테이블화시킨 PIVOT할 테이블 LEFT JOIN

        (SELECT SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8) MM,                    --계획된 DATA값 테이블화 
               '01. PLAN' COLVAL,
               COUNT(*) CNT
               FROM CUSTOMER_EO_02
               GROUP BY SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8)
        )  
        UNION ALL                                                                    --위 테이블 아래테이블 합치기 
        (
        SELECT SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8) MM,                     --해결한 DATA값 테이블화
               '02. ACT' COLVAL,
               COUNT(CUST_ACT_EO) ACT_CNT
             FROM CUSTOMER_EO_02
             GROUP BY SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8) 
        ) 
        UNION ALL                                                                    --위 테이블 아래테이블 합치기  
        (
        SELECT SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8) MM,                     --해결못한 DATA값 테이블화 
               '03. UNSOLVED' COLVAL,
               COUNT(SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8))-
               COUNT(SUBSTR(TO_CHAR(CUST_ACT_EO,'YYYY-MM'), 6, 8)) CNT
               
               FROM CUSTOMER_EO_02
               GROUP BY SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8)
        )
        UNION ALL                                                                    --위 테이블 아래테이블 합치
        (
        SELECT SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8) MM,                     --딜레이된 DATA값 테이블화
               '04. DEALY' COLVAL,
               NVL(COUNT(*), 0) CNT
               FROM CUSTOMER_EO_02
               WHERE  CUST_PLAN_EO < CUST_ACT_EO
               GROUP BY SUBSTR(TO_CHAR(CUST_PLAN_EO,'YYYY-MM'), 6, 8)
        )  
) PIV
ON CUST_MONTH = PIV.MM
GROUP BY CUST_MONTH, PIV.MM, PIV.COLVAL
)                                                                                    --LEFT JOIN한테이블들 그룹화 
PIVOT (SUM(CNT)                                                                      --그룹화 한 테이블을 가지고 PIVOT함수를 사용하여 가로로 행열변환
       FOR MM
       IN ('01' AS "1월" , '02' AS "2월", '03' AS "3월", '04' AS "4월", '05' AS "5월", '06' AS "6월"
       , '07' AS "7월", '08' AS "8월", '09' AS "9월", '10' AS "10월", '11' AS "11월", '12' AS "12월")
)
ORDER BY COLVAL;

 

첫번째 사진은 위 쿼리를 동작시켰을때 나오는 결과이고, 두번째 사진은 원본테이블 출력시켰을때의 결과입니다.

제가 원하는 결과값은 세번째 파일처럼 계획이 되지 PLAN에 값이 입력이 되지않은 값들을 미계획으로 따로 분류하여 출력하고싶은데 어려움이있어 질문드립니다.

또한 제가만든 COLVAL의 값은 4가지 밖에 없는데 5줄이 출력되는 이유도 궁금합니다. 

데이터베이스를 시작한지 이주밖에 되지않아서 제가 고쳐야할 쿼리작성법이나 나아가야할점도 지적해주시면 감사하겠습니다!

by 마농 [2020.11.05 13:18:31]
SELECT *
  FROM (SELECT NVL(TO_CHAR(cust_plan_eo, 'mm'), '00') mm
             , COUNT(*) plan_cnt
             , COUNT(cust_act_eo) act_cnt
             , COUNT(*) - COUNT(cust_act_eo) unsolved_cnt
             , COUNT(CASE WHEN cust_plan_eo < cust_act_eo THEN 1 END) dealy_cnt
          FROM customer_eo_02
         GROUP BY TO_CHAR(cust_plan_eo, 'mm')
        )
 UNPIVOT (cnt FOR colval IN ( plan_cnt     AS '01. PLAN'
                            , act_cnt      AS '02. ACT'
                            , unsolved_cnt AS '03. UNSOLVED'
                            , dealy_cnt    AS '04. DEALY'
                            ) )
 PIVOT (SUM(cnt) FOR mm IN ( '01' AS  "1월"
                           , '02' AS  "2월"
                           , '03' AS  "3월"
                           , '04' AS  "4월"
                           , '05' AS  "5월"
                           , '06' AS  "6월"
                           , '07' AS  "7월"
                           , '08' AS  "8월"
                           , '09' AS  "9월"
                           , '10' AS "10월"
                           , '11' AS "11월"
                           , '12' AS "12월"
                           , '00' AS "미계획"
                           ) )
 ORDER BY colval
;

 


by KING_MIN [2020.11.05 13:53:25]

감사합니다. 코드를 바탕으로 공부해도록 하겠습니다.

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