1 2 3 4 5 6 7 8 9 10 11 12 13 14 | select replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace (d.centarea, '0117' , '세종' ), '0116' , '제주' ), '0115' , '경남' ), '0114' , '경북' ), '0113' , '전남' ), '0112' , '전북' ), '0111' , '충남' ), '0110' , '충북' ), '0109' , '강원' ), '0108' , '경기' ), '0107' , '울산' ), '0106' , '대전' ), '0105' , '광주' ), '0104' , '인천' ), '0103' , '대구' ), '0102' , '부산' ), '0101' , '서울' ) 지역 , d.centcode , d.centname , c.cnt , c.bongcnt from ( select a.centcode , count (a.centcode) cnt , count ( distinct (a.resno)) bongcnt from resactres a inner join centmst b on a.centcode = b.centcode where a.actdate between '2014-07-01' and '2015-06-30' group by a.centcode, a.resno having count (a.resno) >= 200) c, centmst d where c.centcode = d.centcode |
이렇게 쿼리를 짜게 되면
지역 센터코드 센터명 count값 인원
광주 01000169 A 231 1
전남 01000528 B 206 1
광주 01000532 C 229 1
광주 01000532 C 214 1
경북 01000534 D 219 1
경기 01000553 E 246 1
경기 01000553 E 206 1
경기 01000553 E 247 1
이러한 데이터가 나오는데...
이 데이터를 지역 옆에 센터 코드로 그룹을 맺으려고 합니다.
예를 들면
지역 센터코드 센터명 인원
광주 01000169 A 1
전남 01000528 B 1
광주 01000532 C 2
경북 01000534 D 1
경기 01000553 E 3
일단 count 값을 보여주는 컬럼을 지우고 센터로 그룹을 맺으면 될 것 같은데...
그런데 count(distinct(a.resno)) bongcnt 이 부분 때문인지...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | select aaa.지역, aaa.centcode, aaa.centname, sum (aaa.bongcnt) from ( select replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace ( replace (d.centarea, '0117' , '세종' ), '0116' , '제주' ), '0115' , '경남' ), '0114' , '경북' ), '0113' , '전남' ), '0112' , '전북' ), '0111' , '충남' ), '0110' , '충북' ), '0109' , '강원' ), '0108' , '경기' ), '0107' , '울산' ), '0106' , '대전' ), '0105' , '광주' ), '0104' , '인천' ), '0103' , '대구' ), '0102' , '부산' ), '0101' , '서울' ) 지역 , d.centcode , d.centname , c.cnt , c.bongcnt from ( select a.centcode , count (a.centcode) cnt , count ( distinct (a.resno)) bongcnt from resactres a inner join centmst b on a.centcode = b.centcode where a.actdate between '2014-07-01' and '2015-06-30' group by a.centcode, a.resno having count (a.resno) >= 200) c, centmst d where c.centcode = d.centcode) aaa group by aaa.지역, aaa.centcode, aaa.centname, aaa.bongcnt |
일단은 이렇게 만들긴 했는데...
제가 원하는바 제대로 된 것인지...
쿼리를 느리게 하는 요인이 어떤 부분이 있는지...
알려 주시면 감사하겠습니다 ㅠㅠ
아침부터 머리 아프게 해드려 죄송합니다 ㄷㄷ;
1. GROUP BY 에 resno 가 있어서 여러행으로 나오는 것입니다.
- 그룹바이 항목에서 제외하세요
2. centmst 가 쓸데없이 2번 조인되네요.
- 집계후 한번만 조인하세요
3. Replace 를 무지막지하게 사용하셨네요.
- DECODE 로 해결 가능하겠네요.
- 지역코드테이블이 따로 있다면 조인하여 사용하는게 좋겠네요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT DECODE(b.centarea, '0117' , '세종' , '0116' , '제주' , '0115' , '경남' , '0114' , '경북' , '0113' , '전남' , '0112' , '전북' , '0111' , '충남' , '0110' , '충북' , '0109' , '강원' , '0108' , '경기' , '0107' , '울산' , '0106' , '대전' , '0105' , '광주' , '0104' , '인천' , '0103' , '대구' , '0102' , '부산' , '0101' , '서울' ) AS 지역 , b.centcode , b.centname , a.cnt , a.bongcnt FROM ( SELECT centcode , COUNT (*) cnt , COUNT ( DISTINCT resno) bongcnt FROM resactres WHERE actdate BETWEEN '2014-07-01' AND '2015-06-30' GROUP BY centcode ) a INNER JOIN centmst b ON a.centcode = b.centcode ; |
음...
제가 Having 절을 빼먹었네요.
Having 절을 보니 Group By 에 resno 가 있는게 의미상 맞을지도 모르겠네요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | SELECT DECODE(b.centarea, '0117' , '세종' , '0116' , '제주' , '0115' , '경남' , '0114' , '경북' , '0113' , '전남' , '0112' , '전북' , '0111' , '충남' , '0110' , '충북' , '0109' , '강원' , '0108' , '경기' , '0107' , '울산' , '0106' , '대전' , '0105' , '광주' , '0104' , '인천' , '0103' , '대구' , '0102' , '부산' , '0101' , '서울' ) AS 지역 , b.centcode , b.centname -- , a.cnt , a.bongcnt FROM ( SELECT centcode -- , SUM(cnt) cnt , COUNT (*) bongcnt FROM ( SELECT centcode -- , COUNT(*) cnt FROM resactres WHERE actdate BETWEEN '2014-07-01' AND '2015-06-30' GROUP BY centcode, resno HAVING COUNT (*) >= 200 ) GROUP BY centcode ) a INNER JOIN centmst b ON a.centcode = b.centcode ; |