로그 테이블 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
이런식으로 날짜가 가로로 출력되고 범위에 해당하는 날짜의 카운트와 합계를 구하려고 합니다.
혹시 이게 쿼리로 안되는지요?
날짜는 검색 옵션이라 늘 유동적입니다.
프로그래밍화 해야 하는지
아니면 각 날짜에 해당하는 카운트를 각각 따로 인라인뷰로 쿼리를 해야 하는지요?
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 ;
마농님 답변 감사 합니다.
마농님 답변 주신 쿼리보면 음..
날짜의 조회 기간에 따라서 해당 날짜만큼 프로그램상에서 다이나믹 쿼리를 만들어야
되는건가요?
그냥 31개 한다고 해서 크게 문제 될 것 없을 것 같습니다만...
굳이 2월엔 28개, 3월엔 31개, 4월엔 30개 이런식으로 구분할 필요가 있을 런지요...
아 ~ 날짜가 한달 통째로 나오는게 아니고
5~10일 이렇게 조회할 수도 있거든요.
그겄때문에요.
가변적으로 적용하려면 다이나믹SQL로 해야죠.
다이나믹 SQL 강좌 : http://www.gurubee.net/lecture/1720