원본 | 수정본 | |||||
D_DATE | ID | M_TYPE | COUNT | UV | ||
2013-01-27 17:00 | 123456 | 123 | 년도별 합산 | 15 | ||
2013-01-28 17:00 | 456789 | 131 | 2월 UV | 3 | ||
2013-01-29 16:00 | 123456 | 123 | 2월 SUM | 8 | ||
2013-01-29 17:00 | 123456 | 131 | 2월 AVG | 1.6 | ||
2013-01-30 17:00 | 135790 | 131 | 2013-02-05 | 2 | 1 | |
2013-01-30 18:00 | 135790 | 123 | 2013-02-04 | 1 | 1 | |
2013-01-31 17:00 | 123456 | 123 | 2013-02-03 | 1 | 1 | |
2013-02-01 17:00 | 123456 | 123 | 2013-02-02 | 2 | 1 | |
2013-02-01 18:00 | 123456 | 131 | 2013-02-01 | 2 | 1 | |
2013-02-02 17:00 | 456789 | 131 | 1월 UV | 3 | ||
2013-02-02 20:00 | 456789 | 123 | 1월 SUM | 7 | ||
2013-02-03 17:00 | 123456 | 123 | 1월 AVG | 1.4 | ||
2013-02-04 17:00 | 135790 | 131 | 2013-01-31 | 1 | 1 | |
2013-02-05 17:00 | 123456 | 123 | 2013-01-30 | 2 | 1 | |
2013-02-05 21:00 | 123456 | 131 | 2013-01-29 | 2 | 1 | |
2013-01-28 | 1 | 1 | ||||
2013-01-27 | 1 | 1 |
구분 | CNT | UV |
년도별 | 15 | 3 |
2월 SUM | 8 | 3 |
2월 AVG | 1.6 |
구분 | CNT | AVG | UV |
년도별 | 15 | 1.5 | 3 |
2월 SUM | 8 | 1.6 | 3 |
WITH t AS ( SELECT TO_DATE('2013-01-27 17', 'yyyy-mm-dd hh24') d_date, 123456 id, 123 m_type FROM dual UNION ALL SELECT TO_DATE('2013-01-28 17', 'yyyy-mm-dd hh24'), 456789, 131 FROM dual UNION ALL SELECT TO_DATE('2013-01-29 16', 'yyyy-mm-dd hh24'), 123456, 123 FROM dual UNION ALL SELECT TO_DATE('2013-01-29 17', 'yyyy-mm-dd hh24'), 123456, 131 FROM dual UNION ALL SELECT TO_DATE('2013-01-30 17', 'yyyy-mm-dd hh24'), 135790, 131 FROM dual UNION ALL SELECT TO_DATE('2013-01-30 18', 'yyyy-mm-dd hh24'), 135790, 123 FROM dual UNION ALL SELECT TO_DATE('2013-01-31 17', 'yyyy-mm-dd hh24'), 123456, 123 FROM dual UNION ALL SELECT TO_DATE('2013-02-01 17', 'yyyy-mm-dd hh24'), 123456, 123 FROM dual UNION ALL SELECT TO_DATE('2013-02-01 18', 'yyyy-mm-dd hh24'), 123456, 131 FROM dual UNION ALL SELECT TO_DATE('2013-02-02 17', 'yyyy-mm-dd hh24'), 456789, 131 FROM dual UNION ALL SELECT TO_DATE('2013-02-02 20', 'yyyy-mm-dd hh24'), 456789, 123 FROM dual UNION ALL SELECT TO_DATE('2013-02-03 17', 'yyyy-mm-dd hh24'), 123456, 123 FROM dual UNION ALL SELECT TO_DATE('2013-02-04 17', 'yyyy-mm-dd hh24'), 135790, 131 FROM dual UNION ALL SELECT TO_DATE('2013-02-05 17', 'yyyy-mm-dd hh24'), 123456, 123 FROM dual UNION ALL SELECT TO_DATE('2013-02-05 21', 'yyyy-mm-dd hh24'), 123456, 131 FROM dual ) -- 1. 우선 제일 마지막에 추천한 양식으로 하면 초 간결하지요... SELECT COALESCE(ymd, ym, yy) dt , COUNT(*) cnt , COUNT(*) / COUNT(DISTINCT ymd) avg , COUNT(DISTINCT id) uv FROM (SELECT TO_CHAR(d_date, 'yyyy') yy , TO_CHAR(d_date, 'yyyy-mm') ym , TO_CHAR(d_date, 'yyyy-mm-dd') ymd , id FROM t ) GROUP BY yy, ROLLUP(ym, ymd) ORDER BY yy DESC, ym DESC, ymd DESC ; -- 2. 중간 형태의 양식으로 하면 SELECT COALESCE(ymd, ym, yy) || DECODE(GROUPING_ID(1, ymd), 1, ' AVG', 3, ' SUM') dt , COUNT(*) / DECODE(GROUPING(1), 0, COUNT(DISTINCT ymd), 1) cnt , COUNT(DISTINCT id) / DECODE(GROUPING(1), 0, COUNT(DISTINCT ymd), 1) uv FROM (SELECT TO_CHAR(d_date, 'yyyy') yy , TO_CHAR(d_date, 'yyyy-mm') ym , TO_CHAR(d_date, 'yyyy-mm-dd') ymd , id FROM t ) GROUP BY yy, ROLLUP(ym, 1, ymd) ORDER BY yy DESC, ym DESC, ymd DESC, GROUPING(1) DESC ; -- 3. 최초 요규사항 양식으로 하면 SELECT DECODE(GROUPING_ID(ym, 1, 2, ymd) , 0, ymd , 1, ym || ' AVG' , 3, ym || ' SUM' , 7, ym || ' UV' , 15, yy || ' SUM' ) dt , DECODE(GROUPING_ID(ym, 1, 2, ymd) , 1, COUNT(*) / COUNT(DISTINCT ymd) , 7, null , COUNT(*) ) cnt , DECODE(GROUPING_ID(ym, 1, 2, ymd) , 0, COUNT(DISTINCT id) , 7, COUNT(DISTINCT id) ) uv FROM (SELECT TO_CHAR(d_date, 'yyyy') yy , TO_CHAR(d_date, 'yyyy-mm') ym , TO_CHAR(d_date, 'yyyy-mm-dd') ymd , id FROM t ) GROUP BY yy, ROLLUP(ym, 1, 2, ymd) ORDER BY yy DESC, ym DESC, ymd DESC, GROUPING_ID(ym, 1, 2, ymd) DESC ; -- 여담. -- 요즘 데이터 모델링 쪽 스터디를 진행했었는데. -- 모델링(설계)를 잘해야 한다는 걸 느끼게 하는 문제였네요. -- 의미 중복 및 빈공간이 나오는 모델은 쿼리가 복잡해 지네요.