오라클
날짜별로 누적 회원수를 구하고 싶습니다.
단 조건은
1. 2023.01.01 ~ 2023.03.30 까지 일자별로 누적회원수
2. 탈퇴하지 않은 고객 중 2023.06.01 이후 가입자 제외
3. 해당일자의 유효한회원수라서 2/3일이면 2/.3 탈퇴된 고객도 포함해야함
원하는 값
일자 | 가입자수 | 총고객수 |
20230101 | 100 | 1100 (230101이전 가입자수+ 1/1가입자수) |
20230102 | 50 | 1150 |
20230103 | 200 | 1350 |
20230104 | 100 | 1450 |
20230105 | 300 | 1750 |
테이블 정보(고객테이블)
* 사용여부 = Y 면 활동하는 고객
* 삭제 여부 = Y 면 탈퇴한 고객( NULL 값이거나 'N' 이면 활동고객)
* 삭제일자가 IS NULL이면 활동하는 고객(값이 있으면 해당날짜 탈퇴고객임)
고객번호 | 성명 | 가입일자 | 사용여부 | 삭제여부 | 삭제일자 |
000001 | 삭제고객 | 20010303 | N | Y | 20230203 |
000002 | 홍길동1 | 20230101 | Y | ||
000003 | 홍길동2 | 20230215 | Y | ||
000004 | 홍길동3 | 20020502 | Y | N | |
000005 | 홍길동4 | 20031215 | Y | N | |
000006 | 홍길동5 | 20040610 | Y | ||
000007 | 홍길동6 | 20040204 | Y | ||
000008 | 삭제고객 | 20031218 | N | Y | 20150804 |
000009 | 홍길동8 | 20010224 | Y | ||
000010 | 홍길동9 | 20050526 | Y | ||
000011 | 홍길동10 | 20040716 | Y | ||
000012 | 홍길동11 | 20040622 | N | N | |
000013 | 홍길동12 | 20160407 | N | N |
WITH usr_t AS ( SELECT '000001' usr_no, '삭제고객' usr_nm, '20010303' reg_dt, 'N' use_yn, 'Y' del_yn, '20230203' del_dt FROM dual UNION ALL SELECT '000002', '홍길동1' , '20230101', 'Y', '' , '' FROM dual UNION ALL SELECT '000003', '홍길동2' , '20230215', 'Y', '' , '' FROM dual UNION ALL SELECT '000004', '홍길동3' , '20020502', 'Y', 'N', '' FROM dual UNION ALL SELECT '000005', '홍길동4' , '20031215', 'Y', 'N', '' FROM dual UNION ALL SELECT '000006', '홍길동5' , '20040610', 'Y', '' , '' FROM dual UNION ALL SELECT '000007', '홍길동6' , '20040204', 'Y', '' , '' FROM dual UNION ALL SELECT '000008', '삭제고객', '20031218', 'N', 'Y', '20150804' FROM dual UNION ALL SELECT '000009', '홍길동8' , '20010224', 'Y', '' , '' FROM dual UNION ALL SELECT '000010', '홍길동9' , '20050526', 'Y', '' , '' FROM dual UNION ALL SELECT '000011', '홍길동10', '20040716', 'Y', '' , '' FROM dual UNION ALL SELECT '000012', '홍길동11', '20040622', 'N', 'N', '' FROM dual UNION ALL SELECT '000013', '홍길동12', '20160407', 'N', 'N', '' FROM dual ) SELECT * FROM (SELECT a.dt , COUNT(DECODE(b.gb, 1, 1)) cnt_reg -- 당일 가입자수 , COUNT(DECODE(b.gb, 2, 1)) cnt_del -- 당일 탈퇴자수(하루전 탈퇴 기준) , SUM(COUNT(DECODE(b.gb, 1, 1))) OVER(ORDER BY a.dt) sum_reg -- 누적 가입자수 , SUM(COUNT(DECODE(b.gb, 2, 1))) OVER(ORDER BY a.dt) sum_del -- 누적 탈퇴자수 , SUM(COUNT(DECODE(b.gb, 1, 1))) OVER(ORDER BY a.dt) - SUM(COUNT(DECODE(b.gb, 2, 1))) OVER(ORDER BY a.dt) sum_use -- 누적 유효자수 FROM (-- 조회 기간 달력 생성(하루 전일까지) SELECT TO_CHAR(sdt + LEVEL - 2, 'yyyymmdd') dt FROM (SELECT TO_DATE('20230101', 'yyyymmdd') sdt , TO_DATE('20230330', 'yyyymmdd') edt FROM dual) CONNECT BY LEVEL <= edt - sdt + 2 ) a LEFT OUTER JOIN (SELECT gb , GREATEST('20221231', DECODE(gb, 1, dt, TO_CHAR(TO_DATE(dt, 'yyyymmdd') + 1, 'yyyymmdd'))) dt FROM usr_t UNPIVOT (dt FOR gb IN (reg_dt AS 1, del_dt AS 2) ) ) b ON a.dt = b.dt GROUP BY a.dt ) -- WHERE dt >= '20230101' ;