안녕하세요. 구루비에서 많은 도움을 받고 있는데요^^
현재 년도월 별 웹사이트 방문자를 구해 평균계산을 하려고 합니다.
아래 쿼리는 2016.10월 ~12월, 201708월에 방문자에 대한 건수를 뽑은 쿼리와 결과 값입니다.
아래의 데이터를 기준으로 해당 월별 방문 평균값과 전체 방문건수의 평균값을 쿼리로 구하려고 합니다.
전체 평균계산을 하자면 (2016년10월 건수 + 2016년11월 건수 + 2016년12월 건수 + 2018년8월 건수)/4 해야하는데 현재 쿼리상으로 평균을 함께 추가하는 방법을
문의드립니다... 그리고 GROUP BY GROUPING SETS (SUBSTR(W_DATE, 1, 6)), MEM_NO 부분에 MEM_NO 컬럼을 GROUPING SETS 에 포함을 시키면 전체 합계는 나오는데 회원 별 소계는 안됩니다... 그래서 소계와 합계 결과도 함께 낼 수 있는 방법도 같이 문의 드립니다.....
SELECT
DECODE(SUBSTR(W_DATE, 1, 6), NULL, '합계', SUBSTR(W_DATE, 1, 6)) W_DATE,
MEM_NO,
COUNT(*)
FROM
(SELECT
TO_CHAR(W_DATE, 'YYYYMMDD') W_DATE,
MEM_NO,
COUNT(*) CNT
FROM
방문기록 테이블
WHERE
REGEXP_LIKE(TO_CHAR(W_DATE, 'YYYYMMdd'), '201610|201611|201612|201708')
GROUP BY TO_CHAR(W_DATE, 'YYYYMMDD'), MEM_NO)
GROUP BY GROUPING SETS (SUBSTR(W_DATE, 1, 6)), MEM_NO
ORDER BY MEM_NO, W_DATE;
--결과값
방문날짜 | 회원번호 | 방문건수 |
201610 | 10059 | 4 |
201611 | 10059 | 6 |
201612 | 10059 | 3 |
201708 | 10059 | 1 |
201610 | 1021 | 20 |
201611 | 1021 | 23 |
201612 | 1021 | 15 |
201610 | 10280 | 13 |
201611 | 10280 | 8 |
201612 | 10280 | 5 |
201610 | 10369 | 4 |
201611 | 10369 | 4 |
201612 | 10369 | 8 |
201708 | 10369 | 2 |
201610 | 10460 | 15 |
201611 | 10460 | 14 |
201612 | 10460 | 24 |
201708 | 10460 | 7 |
201708 | 11714 | 8 |
-- 소계와 합계 결과===========
방문날짜 | 회원번호 | 방문건수 | 평균값 |
201610 | 10059 | 4 | |
201611 | 10059 | 6 | |
201612 | 10059 | 3 | |
201708 | 10059 | 1 | |
소계 | 10059 | 14 | |
201610 | 1021 | 20 | |
201611 | 1021 | 23 | |
201612 | 1021 | 15 | |
소계 | 1021 | 58 | ??? |
201610 | 10280 | 13 | |
201611 | 10280 | 8 | |
201612 | 10280 | 5 | |
소계 | 10280 | 26 | ??? |
201610 | 10369 | 4 | |
201611 | 10369 | 4 | |
201612 | 10369 | 8 | |
201708 | 10369 | 2 | |
소계 | 10369 | 18 | ??? |
201610 | 10460 | 15 | |
201611 | 10460 | 14 | |
201612 | 10460 | 24 | |
201708 | 10460 | 7 | |
소계 | 10460 | 60 | ??? |
201708 | 11714 | 8 | |
소계 | 11714 | 8 | ??? |
합계 | 176 | ??? |
WITH T AS ( SELECT '201610' DT , '10059' ID , 4 CNT FROM DUAL UNION ALL SELECT '201611', '10059', 6 FROM DUAL UNION ALL SELECT '201612', '10059', 3 FROM DUAL UNION ALL SELECT '201708', '10059', 1 FROM DUAL UNION ALL SELECT '201610', '1021', 20 FROM DUAL UNION ALL SELECT '201611', '1021', 23 FROM DUAL UNION ALL SELECT '201612', '1021', 15 FROM DUAL UNION ALL SELECT '201610', '10280', 13 FROM DUAL UNION ALL SELECT '201611', '10280', 8 FROM DUAL UNION ALL SELECT '201612', '10280', 5 FROM DUAL UNION ALL SELECT '201610', '10369', 4 FROM DUAL UNION ALL SELECT '201611', '10369', 4 FROM DUAL UNION ALL SELECT '201612', '10369', 8 FROM DUAL UNION ALL SELECT '201708', '10369', 2 FROM DUAL UNION ALL SELECT '201610', '10460', 15 FROM DUAL UNION ALL SELECT '201611', '10460', 14 FROM DUAL UNION ALL SELECT '201612', '10460', 24 FROM DUAL UNION ALL SELECT '201708', '10460', 7 FROM DUAL UNION ALL SELECT '201708', '11714', 8 FROM DUAL ) SELECT CASE WHEN ID IS NULL THEN '합게' WHEN DT IS NULL THEN '소계' ELSE DT END DT , ID , SUM(CNT) CNT FROM T GROUP BY ROLLUP (ID ,DT) ORDER BY ID
SELECT DECODE(GROUPING_ID(mem_no, w_date), 0, w_date, 1, '소계', 3, '합계') w_date , mem_no , SUM(cnt) cnt , DECODE(GROUPING(w_date), 1, ROUND(AVG(cnt), 2)) avg FROM (SELECT TO_CHAR(w_date, 'yyyymm') w_date , mem_no -- , COUNT(*) cnt , COUNT(DISTINCT TO_CHAR(w_date, 'yyyymmdd')) cnt FROM 방문기록테이블 WHERE TO_CHAR(w_date, 'yyyymm') IN ('201610', '201611', '201612', '201708') GROUP BY TO_CHAR(w_date, 'yyyymm'), mem_no ) GROUP BY ROLLUP(mem_no, w_date) ;