select c.centarea, min(b.managename) 구분, sum(d.cnt) 등록, sum(c.cnt) 활동, sum(case when centtype >= '001' and centtype <= '010' then c.cnt else 0 end) 계, sum(decode(centtype,'003',c.cnt,0)) 아, sum(decode(centtype,'004',c.cnt,0)) 노, sum(decode(centtype,'005',c.cnt,0)) 장, sum(decode(centtype,'006',c.cnt,0)) 여, sum(decode(centtype,'008',c.cnt,0)) 정, sum(decode(centtype,'007',c.cnt,0)) 노, sum(decode(centtype,'009',c.cnt,0)) 복, sum(case when centtype in ('010','001','002') then c.cnt else 0 end) 법, sum(decode(centtype,'011',c.cnt,0)) 보, sum(case when centtype >= '012' then c.cnt else 0 end) 기타 from centmst_blood_2015 a, managecode b, (select a.centarea, b.centcode, count(distinct a.resno) cnt from resactres_blood_2015 a, resmst_blood_2015 b where a.resno = b.resno group by a.centarea, b.centcode) c, -- 활동 (select centcode, count(*) cnt from resmst_blood_2015 where registedate <= '2015-12-31' group by centcode) d -- 등록 where a.centarea = b.managecode and b.largecode = 'CM00' and a.centcode = c.centcode and a.centcode = d.centcode group by c.centarea;
C 의 엘리어스 데이터는 정상적으로 나옵니다만...
D 의 엘리어스도 이상할게 없지만
and a.centcode = d.centcode 를 조인 해서 데이터를 출력하게 되면 이상하게 나옵니다.
등록 활동
중앙 | 6748435 | 186682 |
서울 | 6336845 | 291487 |
부산 | 4390587 | 78334 |
C와 D의 데이터는 값이 틀리기 떄문에 조인을 걸면 안되고...
정상적인 데이터로는
중앙 | 286,694 | 186,682 |
서울 | 1,412,319 | 291,487 |
부산 | 390,809 | 78,334 |
이렇게 나와야 하는데 숫자만 바꾸면 되긴 하지만... 이게 장기적으로 사용될 예정이라..
애매합니다. ㅠㅠ 한 몇일 고민했는데 답이 안나와서 문의 드립니다.
조언 부탁드립니다.
select a.centarea, min(b.managename) 구분, sum(d.cnt) 등록, sum(c.cnt) 활동, sum(case when centtype >= '001' and centtype <= '010' then c.cnt else 0 end) 계, sum(decode(centtype,'003',c.cnt,0)) 아, sum(decode(centtype,'004',c.cnt,0)) 노, sum(decode(centtype,'005',c.cnt,0)) 장, sum(decode(centtype,'006',c.cnt,0)) 여, sum(decode(centtype,'008',c.cnt,0)) 정, sum(decode(centtype,'007',c.cnt,0)) 노, sum(decode(centtype,'009',c.cnt,0)) 복, sum(case when centtype in ('010','001','002') then c.cnt else 0 end) 법, sum(decode(centtype,'011',c.cnt,0)) 보, sum(case when centtype >= '012' then c.cnt else 0 end) 기타 --(centtype 센터정보 컬럼 입니다, centmst_blood_2015 테이블에서 가져옵니다.) from centmst_blood_2015 a, --(센터정보 테이블) managecode b, --(공통코드 테이블) (select a.centarea, b.centcode, count(distinct a.resno) cnt from resactres_blood_2015 a, resmst_blood_2015 b where a.resno = b.resno group by a.centarea, b.centcode) c, -- 활동 (활동한 사람과 고객정보가 일치하는지 확인) (select centcode, count(*) cnt from resmst_blood_2015 where registedate <= '2015-12-31' group by centcode) d -- 등록 ( 2015-12-31일 이전까지 가입한 고객정보를 카운트) where a.centarea = b.managecode --(지역코드) and b.largecode = 'CM00' --(지역구분코드) and a.centcode = c.centcode --(활동 센터코드) and a.centcode = d.centcode --(등록 센터코드) group by a.centarea;
구분 | 등록 | 활동 | 계 | 아 | 노 | 장 | 여 | 정 | 노 | 복 | 법 | 보 | 기타 |
중앙 | 6748435 | 186682 | 91754 | 10752 | 28583 | 23821 | 557 | 1499 | 1636 | 15003 | 9903 | 6435 | 88493 |
서울 | 6336845 | 291487 | 232468 | 21333 | 59746 | 54014 | 871 | 2010 | 2913 | 53967 | 37614 | 10224 | 48795 |
centmst_blood_2015 : 센터정보 테이블 ( pk: centcode index : centcode, centarea)
managecode : 공통코드 테이블 ( pk: managecode index : managecode)
resactres_blood_2015 : 활동이력 테이블 ( pk: RESNO index : resno, centcode, centarea)
resmst_blood_2015 : 고객정보 테이블 ( pk: RESNO index : resno, centcode)
RESNO(연번), centcode(센터번호), centarea(센터지역)
centmst_blood_2015의 센터 기준으로 resmst_blood_2015(고객정보) 2015-12-31일까지 가입한 클라이언트를 카운트 합니다.
centmst_blood_2015의 센터 기준으로 centtype(센터의 타입에 따라 resactres_blood_2015(활동내역) 을 카운트 합니다.
고객정보와 활동내역을 조인하지 않기 때문에 데이터가 따로따로 나와야 한다고 생각 하는데...
실상 생각했던 데이터와 값이 틀리게 나옵니다.
헉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
centmst_blood_2015 : 센터정보 테이블 ( pk: centcode, largecode index : centcode, centarea)
managecode : 공통코드 테이블 ( pk: managecode index : managecode)
resactres_blood_2015 : 활동이력 테이블 ( pk: RESNO, actdate, actseq index : resno, centcode, centarea)
resmst_blood_2015 : 고객정보 테이블 ( pk: RESNO index : resno, centcode)
centmst_blood_2015 테이블과 resactres_blood_2015 테이블에 pk 추가 했습니다.
나머지 테이블은 변동 없습니다.
select a.centarea, min(b.managename) 구분, sum(d.cnt) 등록 from centmst_blood_2015 a, managecode b, (select centcode, count(*) cnt from resmst_blood_2015 where registedate <= '2015-12-31' group by centcode) d -- 등록 where a.centarea = b.managecode and b.largecode = 'CM00' and a.centcode = d.centcode group by a.centarea;
이렇게 추출 하면 데이터 확인 가능합니다
하아....그냥 따로 추출 해야 겠습니다 ㅠㅠ
이유가 뭔지 모르겠네요
조언 감사합니다~
select c.centarea, min(b.managename) 구분, sum(d.cnt) 등록, sum(c.cnt) 활동, sum(case when centtype >= '001' and centtype <= '010' then c.cnt else 0 end) 계, sum(decode(centtype,'003',c.cnt,0)) 아, sum(decode(centtype,'004',c.cnt,0)) 노, sum(decode(centtype,'005',c.cnt,0)) 장, sum(decode(centtype,'006',c.cnt,0)) 여, sum(decode(centtype,'008',c.cnt,0)) 정, sum(decode(centtype,'007',c.cnt,0)) 노, sum(decode(centtype,'009',c.cnt,0)) 복, sum(case when centtype in ('010','001','002') then c.cnt else 0 end) 법, sum(decode(centtype,'011',c.cnt,0)) 보, sum(case when centtype >= '012' then c.cnt else 0 end) 기타 from centmst_blood_2015 a, managecode b, (select a.centarea, b.centcode, count(distinct a.resno) cnt from resactres_blood_2015 a, resmst_blood_2015 b where a.resno = b.resno group by a.centarea, b.centcode) c, -- 활동 (select centcode, count(*) cnt from resmst_blood_2015 where registedate <= '2015-12-31' group by centcode) d -- 등록 where c.centarea = b.managecode and b.largecode = 'CM00' and a.centcode = c.centcode and a.centcode = d.centcode group by c.centarea;
확실히 이렇게 데이터 추출하니깐 말씀하신 카디션곱이 발생한 것 같습니다.
그래서 결론은... 한번에 출력하면 안되겠네요... ㅎㅎ;
감사합니다!!!