원본 | 수정본 | |||||
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | 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 ; -- 여담. -- 요즘 데이터 모델링 쪽 스터디를 진행했었는데. -- 모델링(설계)를 잘해야 한다는 걸 느끼게 하는 문제였네요. -- 의미 중복 및 빈공간이 나오는 모델은 쿼리가 복잡해 지네요. |