해당월
|
A 상품
|
B 상품
|
전체
|
||
누적명수
|
유효명수 |
누적명수
|
유효명수 |
유효명수
|
|
2009-12
|
5000
|
4682
|
50
|
47
|
4712
|
2009-11
|
4000
|
3721
|
40
|
37
|
3729
|
2009-10
|
3000
|
2736
|
30
|
28
|
2739
|
2009-09
|
2000
|
1823
|
20
|
18
|
1825
|
2009-08
|
1000
|
982
|
10
|
9
|
981
|
구하고자 하는 데이터 포맷은 위와 같습니다.
매월 A 상품과 B 상품을 가입하는 사람들 의 통계를 구하려고 합니다.
누적명수는 순수하게 매월 유입되는 명수를 더한 수입니다.
유효명수는 현재시간 기준으로 탈퇴한 회원수를 빼고 난 유효명수를 계산한겁니다.
여기서 문제는 해당 A 상품을 2009년 8월에도 가입할수 있고 2009년 9월에도 가입할수 있다는 겁니다.
그렇기 때문에 해당월에 보면 누적명수는 2009년 9월에 유효명수에서는 8월에 가입한 사람을 빼야 하므로
매월 유효명수는 이전데이터에 대해서 DISTINCT 가 되어야 합니다.
전체 누계에서는 이문제가 A 상품과 B 상품을 둘다 가입한 사람은 한사람으로 DISTINCT 해야 하는데요...
테이블은 mstr_info 하나이며 구성은 아래와 같습니다.
한사람이 같은 상품을 구입한 경우에는 seq_no 만 증가시켜 row 를 추가합니다.
해지해도 데이터는 삭제하지 않으며 상태코드만 변경한후 row 를 보관합니다.
SEQ_NO NUMBER(7) 000001 일련번호
RSDT_NO CHAR(13) XXXXXXXXXXXXX 주민번호
GODS_KIND_TYPE_CD CHAR(1) A 상품코드 (A/B 상품만 존재)
GODS_STTS_CD CHAR(1) 1 상품 상태코드(1:정상, 9:해지)
ISSU_DT CHAR(8) 20091215 구입일자
CLSE_LOST_DT CHAR(8) 20091215 해지일자
GODS_CLSE_RSN_CD VARCHAR2(2) 20 해지사유코드
FST_RGST_DT CHAR(8) 20091215 최초등록일자
LST_CHNG_DTTM CHAR(14) 20091215101213 최종수정일시
LST_CHNG_ID VARCHAR(20) tarzan12 최종수정 ID
어떻게 풀어야 할지 감이 안잡힙니다....
도움을 청하고 싶습니다..
P.S 1 댓글에 첨부합니다.
저위에 데이터 포맷으로 예를 들면
2009년 8월 부터 A상품은 한달에 1000명씩 가입했습니다.
그래서 누적명수는 한달에 1000명씩 더해서 12월달에 5000명이 된것이고요.
유효명수는 현재날짜 12월15일날 조회했을때 상품상태가 정상인것들만 조회해서 각달까지 가입한 유니크한주민번호를 가진 사람의 수를 구한것입니다.
제가 설명을 제대로 못한것 같아 죄송합니다.
지금 현재 누적명수는
SELECT A.ISSU_DT,
SUMCD ,
SUM(SUMCD) OVER (ORDER BY A.ISSU_DT ROWS UNBOUNDED PRECEDING) ROLLSUMCD,
SUMCK,
SUM(SUMCK) OVER (ORDER BY A.ISSU_DT ROWS UNBOUNDED PRECEDING) ROLLSUMCK
FROM
(SELECT ISSU_DT,
SUM(SUMCD) SUMCD,
SUM(SUMCK) SUMCK
FROM (SELECT SUBSTR(ISSU_DT,1,6) ISSU_DT,
DECODE(GODS_KIND_TYPE_CD,'A',COUNT(RSDT_NO),0) SUMCD,
DECODE(GODS_KIND_TYPE_CD,'B',COUNT(RSDT_NO),0) SUMCK
FROM GODS_MSTR_INFO
GROUP BY ISSU_DT, GODS_KIND_TYPE_CD
)
GROUP BY ISSU_DT) A
ORDER BY A.ISSU_DT
이런식으로 구한 상태인데요..
최종 유효명수는
select count(distinct(rsdt_no)) from GODS_MSTR_INFO WHERE GODS_STTS_CD ='1'
을 했을때의 결과값이 동일하게 나와야 하는데.. 이부분을 해결 못하고 있습니다.