피벗 쿼리 질문 입니다. 0 6 2,549

by 비니 [SQL Query] [2014.12.15 14:54:23]


로그 테이블 A가 있습니다.

date_time, code1 , code2, code3, cnt  이렇게 컬럼이 있을때

date_time 이 '20141210'  이렇게 yyyymmdd 형식의 날짜 문자가 들어가있으며

각 코드별 날짜별로 cnt 합계를 구하면

 

20141201 , 1, 1, 0, 100

20141201,  2, 1, 0, 150

20141201   1, 2, 0, 200

20141201   2, 1, 1, 100

20141202 , 1, 1, 0, 110

20141202,  2, 1, 0, 120

20141203   1, 2, 0, 180

20141204   1, 2, 0, 150

20141204,  2, 1, 1, 140

 

위처럼 코드별로 날짜가 있는것도 있고 없는것도 있게 됩니다.

구현하고 싶은건

 code1 , code2, code3, 20141201, 20141202, 20141203....., sum

1, 1, 0,   100,  110, 0, 0, ...., 210

2, 1, 0,   150,  120, 0, 0, .....,270

1, 2, 0,   200,     0, 180, ....., 380

 

이런식으로 날짜가 가로로 출력되고 범위에 해당하는 날짜의 카운트와  합계를 구하려고 합니다.

혹시 이게 쿼리로 안되는지요?

날짜는 검색 옵션이라 늘 유동적입니다.

프로그래밍화 해야 하는지

아니면 각 날짜에 해당하는 카운트를 각각 따로 인라인뷰로 쿼리를 해야 하는지요?

 

by 마농 [2014.12.15 16:00:39]
WITH t AS
(
SELECT '20141201' dt, 1 cd1, 1 cd2, 0 cd3, 100 cnt FROM dual
UNION ALL SELECT '20141201', 2, 1, 0, 150 FROM dual
UNION ALL SELECT '20141201', 1, 2, 0, 200 FROM dual
UNION ALL SELECT '20141201', 2, 1, 1, 100 FROM dual
UNION ALL SELECT '20141202', 1, 1, 0, 110 FROM dual
UNION ALL SELECT '20141202', 2, 1, 0, 120 FROM dual
UNION ALL SELECT '20141203', 1, 2, 0, 180 FROM dual
UNION ALL SELECT '20141204', 1, 2, 0, 150 FROM dual
UNION ALL SELECT '20141204', 2, 1, 1, 140 FROM dual
)
SELECT cd1, cd2, cd3
     , NVL(SUM(DECODE(SUBSTR(dt, 7, 2), '01', cnt)), 0) "01"
     , NVL(SUM(DECODE(SUBSTR(dt, 7, 2), '02', cnt)), 0) "02"
     , NVL(SUM(DECODE(SUBSTR(dt, 7, 2), '03', cnt)), 0) "03"
     , NVL(SUM(DECODE(SUBSTR(dt, 7, 2), '04', cnt)), 0) "04"
     , NVL(SUM(DECODE(SUBSTR(dt, 7, 2), '05', cnt)), 0) "05"
       -- 중략 --
     , NVL(SUM(DECODE(SUBSTR(dt, 7, 2), '31', cnt)), 0) "31"
     , SUM(cnt) tot
  FROM t
 WHERE dt LIKE '201412%'
 GROUP BY cd1, cd2, cd3
 ORDER BY cd1, cd2, cd3
;

 


by 비니 [2014.12.15 16:38:21]

마농님 답변 감사 합니다.

마농님 답변 주신 쿼리보면 음..

날짜의 조회 기간에 따라서 해당 날짜만큼 프로그램상에서 다이나믹 쿼리를 만들어야

되는건가요?

 


by 마농 [2014.12.15 16:40:35]

그냥 31개 한다고 해서 크게 문제 될 것 없을 것 같습니다만...

굳이 2월엔 28개, 3월엔 31개, 4월엔 30개 이런식으로 구분할 필요가 있을 런지요...


by 비니 [2014.12.15 16:58:32]

아 ~ 날짜가 한달 통째로 나오는게 아니고

5~10일 이렇게 조회할 수도 있거든요.

그겄때문에요.


by 마농 [2014.12.15 17:53:50]

가변적으로 적용하려면 다이나믹SQL로 해야죠.


by 아발란체 [2014.12.15 20:58:44]

다이나믹 SQL 강좌 : http://www.gurubee.net/lecture/1720

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