몇일전에도 한번 올렸던 내용인데...
다른일과 겹쳐서 진행중이다 보니 아직도 해결을 못하고 있네요 ㅠㅠ
SELECT 구 ,SUM(tot) AS tot ,SUM(시봉) AS 시봉 ,SUM(재봉) AS 재봉 ,SUM(전봉) AS 전봉 ,SUM(지사) AS 지사 ,SUM(헌) AS 헌 ,SUM(기) AS 기 FROM( SELECT CASE WHEN AGE < 20 AND SEXDIV = 'F' THEN '10대이하여자' WHEN AGE < 20 AND SEXDIV = 'M' THEN '10대이하남자' WHEN AGE BETWEEN 20 AND 29 AND SEXDIV = 'F' THEN '20대여자' WHEN AGE BETWEEN 20 AND 29 AND SEXDIV = 'M' THEN '20대남자' WHEN AGE BETWEEN 30 AND 39 AND SEXDIV = 'F' THEN '30대여자' WHEN AGE BETWEEN 30 AND 39 AND SEXDIV = 'M' THEN '30대남자' WHEN AGE BETWEEN 40 AND 49 AND SEXDIV = 'F' THEN '40대여자' WHEN AGE BETWEEN 40 AND 49 AND SEXDIV = 'M' THEN '40대남자' WHEN AGE BETWEEN 50 AND 59 AND SEXDIV = 'F' THEN '50대여자' WHEN AGE BETWEEN 50 AND 59 AND SEXDIV = 'M' THEN '50대남자' WHEN AGE >= 60 AND SEXDIV = 'F' THEN '60대이상여자' WHEN AGE >= 60 AND SEXDIV = 'M' THEN '60대이상남자' END AS 구 ,tot ,시봉 ,재봉 ,전봉 ,지사 ,헌 ,기 FROM( SELECT FNGETAGE(b.RESPSNO) AS AGE ,b.SEXDIV ,COUNT(*) AS tot, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '01' THEN 1 ELSE 0 END) 시봉, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '02' THEN 1 ELSE 0 END) 재봉, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '03' THEN 1 ELSE 0 END) 전봉 SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '04' THEN 1 ELSE 0 END) 지사, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '07' THEN 1 ELSE 0 END) 헌, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) NOT IN ('01','02','03','04','07') OR A.ACTTYPE IS NULL THEN 1 ELSE 0 END) 기 FROM resactres_blood_2014 A,RESMST_2014 B WHERE A.RESNO = B.RESNO(+) GROUP BY FNGETAGE(b.RESPSNO), b.SEXDIV ) ) GROUP BY 구 ORDER BY 구
위의 쿼리를 돌리면
202242 7 0 0 0 202209 26
이런 데이터가 나오는데
제가 원하는 데이터는
SELECT COUNT(*) AS tot, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '01' THEN 1 ELSE 0 END) 시봉, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '02' THEN 1 ELSE 0 END) 재봉, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '03' THEN 1 ELSE 0 END) 전봉, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '04' THEN 1 ELSE 0 END) 지사, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '07' THEN 1 ELSE 0 END) 헌, SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) NOT IN ('01','02','03','04','07') OR A.ACTTYPE IS NULL THEN 1 ELSE 0 END) 기 FROM (select resno, ACTTYPE from resactres_blood_2014 where rescentarea='0100') A, --(select FNGETAGE(RESPSNO) AS AGE, SEXDIV, resno from RESMST_2014)B RESMST_2014 B WHERE A.RESNO = B.RESNO(+)
202258 7 0 0 0 202225 26
이 쿼리를 돌리면 나오는데...
위에 쿼리와 밑의 쿼리의 차이는
GROUP BY FNGETAGE(b.RESPSNO), b.SEXDIV
이 구문 이거든요... 데이터 빠지는 부분 없이 위의 형식대로 뽑을 수 있을까요?
답이 될런지요.
일단 위의 구문을 살펴보면
WHERE
A.RESNO = B.RESNO(+)
GROUP
BY
FNGETAGE(b.RESPSNO), b.SEXDIV 에서
FNGETAGE는 평균값을 얻는 FUNCTION같고 ...
B.RESNO(+)라는 것은 A.RESNO에는 존재하지만 B.RESNO(+)에는 존재하지 않을수있다는 전제이잖아요. 그래서 B.RESNO(+)에 있는것만 GROUP
BY
FNGETAGE(b.RESPSNO) 하니까 값이 맞지않을거 같구요. 만약 A와 B가 일대일이라면 동일하게 나오지 않을까요?
아래의 경우는 GROUP
BY 하지 않으니까 A.RESNO 기준으로 FNGETAGE(b.RESPSNO)를 가져오니 그런거 같은데....
짧은 소견입니다... 다른 이유가 있으면????
위의 마농님께서 잘 설명하신거 같구요. 조금만 더 추가 설명드리면요...
SELECT DISTINCT A.RESNO FROM A
SELECT DISTINCT B.RESNO FROM B 를 하여 비교해 보시기 바랍니다.
데이타 발생기준으로 A TABLE에는 데이타가 발생하였는데 B TABLE에는 발생하지 않았을수가 있다는거죠
예를들어 A 테이블에 코드가 10가지로 되어 있는데 B TABLE에는 9가지 밖에 발생안되었을때
위의 GROUP
BY
FNGETAGE(b.RESPSNO) 했을때는 당연히 9개의 코드를가지고 GROUP BY 할테니까요. 만약 A TABLE에 컬럼이 RESPSNO이 있다면 GROUP
BY
FNGETAGE(A.RESPSNO) 하면 문제가 없을거 같은데...(가정입니다.) ...
빨리 해결이 되었으면 합니다. ^^