이런 쿼리 가능할까요? 0 4 719

by 푸릉이 [2018.07.26 16:20:09]


YYYYMM DEPT  CNT  NIGHT_CNT
201501 A  1  0   
201501 B  2  0
201502 A  2  0
201503 C  1  1
201503 D  1  1
201507 F  1  1
........
201512 F  1  1

이런데이터가 있습니다.
근데 이걸 부서단위 년도 단위 CNT, NIGHT_CNT 별로 합산해서 보여주고 하는데요.

          201501                     201502  ..........
DEPT   CNT  NIGHT_CNT   CNT  NIGHT_CNT ........
A      XXX      XXXX           XX      XXX  
B
C

....

이런식으로 옆으로 12월까지 뽑아낼수 있을까요?
상단에 년도는 힘들다면 안보여도 됩니다. 엑셀에서 작업하면 됩니다..
항상 도움받으며 감사함을 느끼고 있습니다. 
 

by 우리집아찌 [2018.07.26 16:45:50]

자주나오는 질문인데요.  조회하면 많이 있긴합니다.

일정한 기간없이 무작위로 컬럼을 추가해서 만든다고 하면 DYNAMIC SQL 사용해야합니다.

단. 2015년만 할것이다 하면 12월까지 고정값을 가지고 STATIC SQL로 만들수있습니다.

어떤형태 이신가요?


by 푸릉이 [2018.07.27 08:21:41]

12월까지입니다.


by 우리집아찌 [2018.07.27 08:57:41]
WITH T AS (
SELECT '201501' YYYYMM , 'A' DEPT,  1 CNT ,  0 NIGHT_CNT FROM DUAL UNION ALL   
SELECT '201501' , 'B' ,  2  ,  0 FROM DUAL UNION ALL   
SELECT '201502' , 'A' ,  2  ,  0 FROM DUAL UNION ALL   
SELECT '201503' , 'C' ,  1  ,  1 FROM DUAL UNION ALL   
SELECT '201503' , 'D' ,  1  ,  1 FROM DUAL UNION ALL   
SELECT '201507' , 'F' ,  1  ,  1 FROM DUAL UNION ALL
SELECT '201512' , 'F' ,  1  ,  1 FROM DUAL 
)

-- GROUP BY - MAX 이용 ( 10G 이하 ) 
SELECT DEPT
     , MAX(CASE WHEN MM = 01 THEN CNT END ) AS CNT_01
     , MAX(CASE WHEN MM = 01 THEN NIGHT_CNT END) AS  NIGHT_CNT_01
     , MAX(CASE WHEN MM = 02 THEN CNT END ) AS CNT_02
     , MAX(CASE WHEN MM = 02 THEN NIGHT_CNT END) AS  NIGHT_CNT_02
     , MAX(CASE WHEN MM = 03 THEN CNT END ) AS CNT_03
     , MAX(CASE WHEN MM = 03 THEN NIGHT_CNT END) AS  NIGHT_CNT_03
     , MAX(CASE WHEN MM = 04 THEN CNT END ) AS CNT_04
     , MAX(CASE WHEN MM = 04 THEN NIGHT_CNT END) AS  NIGHT_CNT_04
     , MAX(CASE WHEN MM = 05 THEN CNT END ) AS CNT_05
     , MAX(CASE WHEN MM = 05 THEN NIGHT_CNT END) AS  NIGHT_CNT_05
     , MAX(CASE WHEN MM = 06 THEN CNT END ) AS CNT_06
     , MAX(CASE WHEN MM = 06 THEN NIGHT_CNT END) AS  NIGHT_CNT_06
     , MAX(CASE WHEN MM = 07 THEN CNT END ) AS CNT_07
     , MAX(CASE WHEN MM = 07 THEN NIGHT_CNT END) AS  NIGHT_CNT_07
     , MAX(CASE WHEN MM = 08 THEN CNT END ) AS CNT_08
     , MAX(CASE WHEN MM = 08 THEN NIGHT_CNT END) AS  NIGHT_CNT_08
     , MAX(CASE WHEN MM = 09 THEN CNT END ) AS CNT_09
     , MAX(CASE WHEN MM = 09 THEN NIGHT_CNT END) AS  NIGHT_CNT_09
     , MAX(CASE WHEN MM = 10 THEN CNT END ) AS CNT_10
     , MAX(CASE WHEN MM = 10 THEN NIGHT_CNT END) AS  NIGHT_CNT_10
     , MAX(CASE WHEN MM = 11 THEN CNT END ) AS CNT_11
     , MAX(CASE WHEN MM = 11 THEN NIGHT_CNT END) AS  NIGHT_CNT_11
     , MAX(CASE WHEN MM = 12 THEN CNT END ) AS CNT_12
     , MAX(CASE WHEN MM = 12 THEN NIGHT_CNT END) AS  NIGHT_CNT_12

  FROM (SELECT YYYYMM 
             , SUBSTR(YYYYMM,5,2) MM
             , DEPT 
             , SUM(CNT) CNT 
             , SUM(NIGHT_CNT) NIGHT_CNT
          FROM T 
         WHERE YYYYMM BETWEEN '201501' AND '201512' 
         GROUP BY YYYYMM , DEPT
        )
 GROUP BY DEPT
 ORDER BY DEPT



-- PIVOT 이용 ( 11G 이상 )
SELECT *
  FROM (SELECT SUBSTR(YYYYMM,5,2) MM
             , DEPT 
             , SUM(CNT) CNT 
             , SUM(NIGHT_CNT) NIGHT_CNT
          FROM T 
         WHERE YYYYMM BETWEEN '201501' AND '201512' 
         GROUP BY YYYYMM , DEPT
        )
  PIVOT ( SUM(CNT) CNT, SUM(NIGHT_CNT) NIGHT_CNT
          FOR MM IN ( '01' , '02' , '03' , '04' , '05' , '06' , '07' , '08' , '09' , '10' , '11' , '12' ))
 

 


by 푸릉이 [2018.07.27 14:45:50]

피벗에 sum 2개를 사용할수가 있었네요 고맙습니다.

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